diff --git a/.betterer.eslint.config.js b/.betterer.eslint.config.js
index 3b44630965e..c1a38731291 100644
--- a/.betterer.eslint.config.js
+++ b/.betterer.eslint.config.js
@@ -143,6 +143,11 @@ module.exports = [
message:
'Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.',
},
+ {
+ selector: 'CallExpression[callee.type="MemberExpression"][callee.property.name="localeCompare"]',
+ message:
+ 'Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.',
+ },
],
},
},
diff --git a/.betterer.results b/.betterer.results
index ca7e75b3558..6429e7b67b5 100644
--- a/.betterer.results
+++ b/.betterer.results
@@ -149,6 +149,9 @@ exports[`better eslint`] = {
"packages/grafana-data/src/themes/createColors.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
+ "packages/grafana-data/src/themes/registry.ts:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"]
+ ],
"packages/grafana-data/src/transformations/matchers/valueMatchers/types.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
@@ -450,7 +453,8 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
[0, 0, 0, "Unexpected any. Specify a different type.", "4"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "5"]
+ [0, 0, 0, "Unexpected any. Specify a different type.", "5"],
+ [0, 0, 0, "Unexpected any. Specify a different type.", "6"]
],
"packages/grafana-prometheus/src/language_utils.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
@@ -597,6 +601,9 @@ exports[`better eslint`] = {
"packages/grafana-ui/src/components/Combobox/useOptions.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
+ "packages/grafana-ui/src/components/ConfirmModal/ConfirmContent.tsx:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"]
+ ],
"packages/grafana-ui/src/components/DataLinks/DataLinkInput.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
@@ -625,6 +632,13 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"]
],
+ "packages/grafana-ui/src/components/Icon/Icon.story.tsx:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"]
+ ],
+ "packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.story.tsx:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "1"]
+ ],
"packages/grafana-ui/src/components/JSONFormatter/json_explorer/json_explorer.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
@@ -756,7 +770,8 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"],
[0, 0, 0, "Unexpected any. Specify a different type.", "4"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "5"]
+ [0, 0, 0, "Unexpected any. Specify a different type.", "5"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "6"]
],
"packages/grafana-ui/src/components/Tags/Tag.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
@@ -913,6 +928,15 @@ exports[`better eslint`] = {
"public/app/core/components/Page/EditableTitle.tsx:5381": [
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"]
],
+ "public/app/core/components/PanelTypeFilter/PanelTypeFilter.tsx:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"]
+ ],
+ "public/app/core/components/RolePicker/RolePickerMenu.tsx:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "1"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "2"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "3"]
+ ],
"public/app/core/components/RolePickerDrawer/RolePickerDrawer.tsx:5381": [
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"]
],
@@ -922,7 +946,9 @@ exports[`better eslint`] = {
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "2"],
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "3"],
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "4"],
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "5"]
+ [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "5"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "6"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "7"]
],
"public/app/core/components/Signup/SignupPage.tsx:5381": [
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"],
@@ -965,6 +991,10 @@ exports[`better eslint`] = {
[0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "1"],
[0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "2"]
],
+ "public/app/core/reducers/navBarTree.ts:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "1"]
+ ],
"public/app/core/services/ResponseQueue.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
@@ -1066,12 +1096,21 @@ exports[`better eslint`] = {
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "5"],
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "6"]
],
+ "public/app/features/actions/ActionVariablesEditor.tsx:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"]
+ ],
"public/app/features/actions/ParamsEditor.tsx:5381": [
- [0, 0, 0, "Do not use any type assertions.", "0"]
+ [0, 0, 0, "Do not use any type assertions.", "0"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "1"]
],
"public/app/features/admin/AdminEditOrgPage.tsx:5381": [
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"]
],
+ "public/app/features/admin/AdminFeatureTogglesTable.tsx:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "1"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "2"]
+ ],
"public/app/features/admin/ServerStatsCard.tsx:5381": [
[0, 0, 0, "Add noMargin prop to Card components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"]
],
@@ -1187,6 +1226,9 @@ exports[`better eslint`] = {
"public/app/features/alerting/unified/components/contact-points/components/ContactPointsFilter.tsx:5381": [
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"]
],
+ "public/app/features/alerting/unified/components/contact-points/utils.ts:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"]
+ ],
"public/app/features/alerting/unified/components/create-folder/CreateNewFolder.tsx:5381": [
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"]
],
@@ -1284,6 +1326,9 @@ exports[`better eslint`] = {
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"],
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"]
],
+ "public/app/features/alerting/unified/components/rule-editor/DashboardPicker.tsx:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"]
+ ],
"public/app/features/alerting/unified/components/rule-editor/ExpressionEditor.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
@@ -1299,7 +1344,8 @@ exports[`better eslint`] = {
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "5"],
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "6"],
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "7"],
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "8"]
+ [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "8"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "9"]
],
"public/app/features/alerting/unified/components/rule-editor/GroupAndNamespaceFields.tsx:5381": [
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"],
@@ -1364,6 +1410,13 @@ exports[`better eslint`] = {
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "2"],
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "3"]
],
+ "public/app/features/alerting/unified/components/rules/RuleListGroupView.tsx:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "1"]
+ ],
+ "public/app/features/alerting/unified/components/rules/RuleListStateView.tsx:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"]
+ ],
"public/app/features/alerting/unified/components/rules/state-history/LokiStateHistory.tsx:5381": [
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"]
],
@@ -1403,6 +1456,9 @@ exports[`better eslint`] = {
"public/app/features/alerting/unified/hooks/useAlertmanagerConfig.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
+ "public/app/features/alerting/unified/hooks/useCombinedRuleNamespaces.ts:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"]
+ ],
"public/app/features/alerting/unified/hooks/useControlledFieldArray.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
@@ -1426,9 +1482,16 @@ exports[`better eslint`] = {
"public/app/features/alerting/unified/rule-list/FilterViewStatus.tsx:5381": [
[0, 0, 0, "Add noMargin prop to Card components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"]
],
+ "public/app/features/alerting/unified/rule-list/StateView.tsx:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"]
+ ],
"public/app/features/alerting/unified/types/receiver-form.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"]
],
+ "public/app/features/alerting/unified/utils/datasource.ts:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "1"]
+ ],
"public/app/features/alerting/unified/utils/misc.test.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"],
@@ -1450,6 +1513,9 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "6"],
[0, 0, 0, "Unexpected any. Specify a different type.", "7"]
],
+ "public/app/features/alerting/unified/utils/rule-id.ts:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"]
+ ],
"public/app/features/alerting/unified/utils/rules.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
@@ -1517,6 +1583,9 @@ exports[`better eslint`] = {
"public/app/features/connections/tabs/ConnectData/index.tsx:5381": [
[0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"]
],
+ "public/app/features/correlations/CorrelationsPage.tsx:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"]
+ ],
"public/app/features/correlations/Forms/ConfigureCorrelationBasicInfoForm.tsx:5381": [
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"],
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"]
@@ -1689,7 +1758,8 @@ exports[`better eslint`] = {
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "2"],
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "3"],
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "4"],
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "5"]
+ [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "5"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "6"]
],
"public/app/features/dashboard-scene/settings/links/DashboardLinkForm.tsx:5381": [
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"],
@@ -1818,7 +1888,8 @@ exports[`better eslint`] = {
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "3"],
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "4"],
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "5"],
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "6"]
+ [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "6"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "7"]
],
"public/app/features/dashboard/components/DashExportModal/DashboardExporter.test.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"],
@@ -2199,7 +2270,9 @@ exports[`better eslint`] = {
],
"public/app/features/datasources/state/selectors.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.", "1"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "2"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "3"]
],
"public/app/features/dimensions/editors/FileUploader.tsx:5381": [
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"]
@@ -2265,6 +2338,9 @@ exports[`better eslint`] = {
"public/app/features/explore/TraceView/components/TracePageHeader/index.tsx:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./TracePageHeader\`)", "0"]
],
+ "public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanLinks.tsx:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"]
+ ],
"public/app/features/explore/TraceView/components/TraceTimelineViewer/TimelineHeaderRow/index.tsx:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./TimelineHeaderRow\`)", "0"]
],
@@ -2297,6 +2373,9 @@ exports[`better eslint`] = {
"public/app/features/explore/TraceView/components/utils/DraggableManager/demo/index.tsx:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./DraggableManagerDemo\`)", "0"]
],
+ "public/app/features/explore/TraceView/components/utils/sort.ts:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"]
+ ],
"public/app/features/explore/TraceView/createSpanLink.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"]
@@ -2499,6 +2578,10 @@ exports[`better eslint`] = {
"public/app/features/plugins/admin/components/PluginDetailsPage.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
+ "public/app/features/plugins/admin/helpers.ts:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "1"]
+ ],
"public/app/features/plugins/admin/pages/Browse.tsx:5381": [
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"],
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"],
@@ -2557,20 +2640,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"],
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "2"]
],
- "public/app/features/provisioning/Config/ConfigForm.tsx:5381": [
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"],
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"],
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "2"],
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "3"],
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "4"],
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "5"],
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "6"],
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "7"],
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "8"],
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "9"],
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "10"],
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "11"]
- ],
"public/app/features/provisioning/Config/ConfigFormGithubCollapse.tsx:5381": [
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"],
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"]
@@ -2585,27 +2654,6 @@ exports[`better eslint`] = {
"public/app/features/provisioning/GettingStarted/SidebarItem.tsx:5381": [
[0, 0, 0, "Add noMargin prop to Card components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"]
],
- "public/app/features/provisioning/Job/RecentJobs.tsx:5381": [
- [0, 0, 0, "Add noMargin prop to Card components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"]
- ],
- "public/app/features/provisioning/Repository/RepositoryCard.tsx:5381": [
- [0, 0, 0, "Add noMargin prop to Card components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"]
- ],
- "public/app/features/provisioning/Repository/RepositoryOverview.tsx:5381": [
- [0, 0, 0, "Add noMargin prop to Card components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"],
- [0, 0, 0, "Add noMargin prop to Card components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"],
- [0, 0, 0, "Add noMargin prop to Card components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "2"],
- [0, 0, 0, "Add noMargin prop to Card components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "3"]
- ],
- "public/app/features/provisioning/Wizard/FinishStep.tsx:5381": [
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"],
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"],
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "2"],
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "3"]
- ],
- "public/app/features/provisioning/types.ts:5381": [
- [0, 0, 0, "Unexpected any. Specify a different type.", "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"],
@@ -2700,7 +2748,8 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "0"]
],
"public/app/features/support-bundles/SupportBundlesCreate.tsx:5381": [
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"]
+ [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "1"]
],
"public/app/features/teams/CreateTeam.tsx:5381": [
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"],
@@ -2932,7 +2981,8 @@ exports[`better eslint`] = {
],
"public/app/features/variables/query/reducer.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.", "1"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "2"]
],
"public/app/features/variables/shared/formatVariable.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
@@ -3259,7 +3309,8 @@ exports[`better eslint`] = {
[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, "Unexpected any. Specify a different type.", "4"]
+ [0, 0, 0, "Unexpected any. Specify a different type.", "4"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "5"]
],
"public/app/plugins/datasource/grafana-testdata-datasource/components/RandomWalkEditor.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
@@ -3626,7 +3677,9 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
- [0, 0, 0, "Unexpected any. Specify a different type.", "3"]
+ [0, 0, 0, "Unexpected any. Specify a different type.", "3"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "4"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "5"]
],
"public/app/plugins/datasource/zipkin/QueryField.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
@@ -3675,10 +3728,17 @@ exports[`better eslint`] = {
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"],
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "2"]
],
+ "public/app/plugins/panel/canvas/editor/element/ParamsEditor.tsx:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"]
+ ],
"public/app/plugins/panel/canvas/editor/element/PlacementEditor.tsx:5381": [
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"],
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"]
],
+ "public/app/plugins/panel/dashlist/DashList.tsx:5381": [
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "0"],
+ [0, 0, 0, "Using localeCompare() can cause performance issues when sorting large datasets. Consider using Intl.Collator for better performance when sorting arrays, or add an eslint-disable comment if sorting a small, known dataset.", "1"]
+ ],
"public/app/plugins/panel/debug/CursorView.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Unexpected any. Specify a different type.", "1"]
@@ -3739,9 +3799,6 @@ exports[`better eslint`] = {
"public/app/plugins/panel/geomap/layers/basemaps/esri.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
- "public/app/plugins/panel/geomap/layers/data/geojsonDynamic.ts:5381": [
- [0, 0, 0, "Do not use any type assertions.", "0"]
- ],
"public/app/plugins/panel/geomap/layers/data/routeLayer.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"]
],
@@ -3882,7 +3939,7 @@ exports[`better eslint`] = {
"public/app/plugins/panel/table/table-new/cells/ColorBackgroundCellOptionsEditor.tsx:5381": [
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"],
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"],
- [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "2"]
+ [0, 0, 0, "Use data-testid for E2E selectors instead of aria-label", "2"]
],
"public/app/plugins/panel/table/table-new/cells/ImageCellOptionsEditor.tsx:5381": [
[0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"],
@@ -4170,6 +4227,164 @@ exports[`no undocumented stories`] = {
}`
};
+exports[`no skipping a11y tests in stories`] = {
+ value: `{
+ "packages/grafana-alerting/src/grafana/contactPoints/components/ContactPointSelector/ContactPointSelector.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/AutoSaveField/AutoSaveField.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Button/Button.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Carousel/Carousel.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Cascader/Cascader.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/ColorPicker/ColorPicker.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/ColorPicker/ColorPickerInput.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Combobox/MultiCombobox.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/ConfirmButton/ConfirmButton.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/ContextMenu/ContextMenu.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/DateTimePickers/TimeOfDayPicker.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/FileDropzone/FileDropzone.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/FormField/FormField.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Forms/Checkbox.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Forms/Field.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Forms/FieldArray.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Forms/FieldSet.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Forms/Form.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Forms/InlineField.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Forms/RadioButtonGroup/RadioButtonGroup.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/InlineToast/InlineToast.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Input/Input.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Layout/Grid/Grid.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Layout/Stack/Stack.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Link/TextLink.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/LoadingBar/LoadingBar.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Menu/Menu.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Modal/Modal.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/PageLayout/PageToolbar.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/PanelChrome/PanelChrome.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/QueryField/QueryField.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/ScrollContainer/ScrollContainer.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Segment/Segment.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Segment/SegmentAsync.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Segment/SegmentInput.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Select/Select.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Select/SelectPerf.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Slider/RangeSlider.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Slider/Slider.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/StatsPicker/StatsPicker.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Switch/Switch.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Table/Table.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/TableInputCSV/TableInputCSV.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Tags/TagList.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/Text/Text.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/ThemeDemos/ThemeDemo.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/ThemeDemos/Typography.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/VizLayout/VizLayout.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ],
+ "packages/grafana-ui/src/components/VizLegend/VizLegend.story.tsx:5381": [
+ [0, 0, 0, "No skipping of a11y tests in stories. Please fix the component or story instead.", "5381"]
+ ]
+ }`
+};
+
exports[`no gf-form usage`] = {
value: `{
"packages/grafana-prometheus/src/components/PromExploreExtraField.tsx:5381": [
diff --git a/.betterer.ts b/.betterer.ts
index 61e6153b4dd..fe3b3c7f9f7 100644
--- a/.betterer.ts
+++ b/.betterer.ts
@@ -17,13 +17,35 @@ export default {
countEslintErrors()
.include('**/*.{ts,tsx}')
.exclude(new RegExp(eslintPathsToIgnore.join('|'))),
- 'no undocumented stories': () => countUndocumentedStories().include('**/!(*.internal).story.tsx'),
+ 'no undocumented stories': () => countUndocumentedStories().include('**/*.story.tsx'),
+ 'no skipping a11y tests in stories': () => countSkippedA11yTestStories().include('**/*.story.tsx'),
'no gf-form usage': () =>
regexp(/gf-form/gm, 'gf-form usage has been deprecated. Use a component from @grafana/ui or custom CSS instead.')
.include('**/*.{ts,tsx,html}')
.exclude(new RegExp('packages/grafana-ui/src/themes/GlobalStyles')),
};
+function countSkippedA11yTestStories() {
+ return new BettererFileTest(async (filePaths, fileTestResult) => {
+ await Promise.all(
+ filePaths.map(async (filePath) => {
+ // look for skipped a11y tests
+ const skipRegex = new RegExp("a11y: { test: 'off' }", 'gm');
+
+ const fileText = await fs.readFile(filePath, 'utf8');
+
+ const hasSkip = skipRegex.test(fileText);
+ if (hasSkip) {
+ // In this case the file contents don't matter:
+ const file = fileTestResult.addFile(filePath, '');
+ // Add the issue to the first character of the file:
+ file.addIssue(0, 0, 'No skipping of a11y tests in stories. Please fix the component or story instead.');
+ }
+ })
+ );
+ });
+}
+
function countUndocumentedStories() {
return new BettererFileTest(async (filePaths, fileTestResult) => {
await Promise.all(
diff --git a/.changelog-archive/CHANGELOG.02.md b/.changelog-archive/CHANGELOG.02.md
index 7fc14a683dc..34945530c68 100644
--- a/.changelog-archive/CHANGELOG.02.md
+++ b/.changelog-archive/CHANGELOG.02.md
@@ -234,7 +234,6 @@ Grunt & Watch tasks:
- binary to `/usr/sbin/grafana-server`
- init.d script improvements, renamed to `/etc/init.d/grafana-server`
- added default file with environment variables,
-
- `/etc/default/grafana-server` (deb/ubuntu)
- `/etc/sysconfig/grafana-server` (centos/redhat)
diff --git a/.citools/Variables.mk b/.citools/Variables.mk
index 54f102dba73..0f41933b138 100644
--- a/.citools/Variables.mk
+++ b/.citools/Variables.mk
@@ -12,6 +12,9 @@ $(shell \
endef
+# Tool: "air"
+air = "$(call compile_tool,air,github.com/air-verse/air)"
+
# Tool: "bra"
bra = "$(call compile_tool,bra,github.com/unknwon/bra)"
diff --git a/.citools/src/air/go.mod b/.citools/src/air/go.mod
new file mode 100644
index 00000000000..6fd4736b93d
--- /dev/null
+++ b/.citools/src/air/go.mod
@@ -0,0 +1,27 @@
+module air
+
+go 1.24.4
+
+tool github.com/air-verse/air
+
+require (
+ dario.cat/mergo v1.0.2 // indirect
+ github.com/air-verse/air v1.62.0 // indirect
+ github.com/bep/godartsass/v2 v2.5.0 // indirect
+ github.com/bep/golibsass v1.2.0 // indirect
+ github.com/creack/pty v1.1.24 // indirect
+ github.com/fatih/color v1.18.0 // indirect
+ github.com/fsnotify/fsnotify v1.9.0 // indirect
+ github.com/gobwas/glob v0.2.3 // indirect
+ github.com/gohugoio/hugo v0.147.6 // indirect
+ github.com/mattn/go-colorable v0.1.14 // indirect
+ github.com/mattn/go-isatty v0.0.20 // indirect
+ github.com/pelletier/go-toml v1.9.5 // indirect
+ github.com/pelletier/go-toml/v2 v2.2.4 // indirect
+ github.com/spf13/afero v1.14.0 // indirect
+ github.com/spf13/cast v1.8.0 // indirect
+ github.com/tdewolff/parse/v2 v2.8.1 // indirect
+ golang.org/x/sys v0.33.0 // indirect
+ golang.org/x/text v0.25.0 // indirect
+ google.golang.org/protobuf v1.36.6 // indirect
+)
diff --git a/.citools/src/air/go.sum b/.citools/src/air/go.sum
new file mode 100644
index 00000000000..d733e3519f3
--- /dev/null
+++ b/.citools/src/air/go.sum
@@ -0,0 +1,45 @@
+dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8=
+dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA=
+github.com/air-verse/air v1.62.0 h1:6CoXL4MAX9dc4xAzLfjMcDfbBoGmW5VjuuTV/1+bI+M=
+github.com/air-verse/air v1.62.0/go.mod h1:EO+jWuetL10tS9raffwg8WEV0t0KUeucRRaf9ii86dA=
+github.com/bep/godartsass/v2 v2.5.0 h1:tKRvwVdyjCIr48qgtLa4gHEdtRkPF8H1OeEhJAEv7xg=
+github.com/bep/godartsass/v2 v2.5.0/go.mod h1:rjsi1YSXAl/UbsGL85RLDEjRKdIKUlMQHr6ChUNYOFU=
+github.com/bep/golibsass v1.2.0 h1:nyZUkKP/0psr8nT6GR2cnmt99xS93Ji82ZD9AgOK6VI=
+github.com/bep/golibsass v1.2.0/go.mod h1:DL87K8Un/+pWUS75ggYv41bliGiolxzDKWJAq3eJ1MA=
+github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s=
+github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE=
+github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
+github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
+github.com/frankban/quicktest v1.7.2/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o=
+github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
+github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
+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/gohugoio/hugo v0.147.6 h1:rL4rnus/5qzj4+FoA+JMzsVvFJ2YZdVIH6pbuCB2P84=
+github.com/gohugoio/hugo v0.147.6/go.mod h1:Sb2COQPDPYG+tRSpePtzKytiuVDqkBivEhgIew1QbNo=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
+github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
+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/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.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
+github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
+github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA=
+github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo=
+github.com/spf13/cast v1.8.0 h1:gEN9K4b8Xws4EX0+a0reLmhq8moKn7ntRlQYgjPeCDk=
+github.com/spf13/cast v1.8.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
+github.com/tdewolff/parse/v2 v2.8.1 h1:J5GSHru6o3jF1uLlEKVXkDxxcVx6yzOlIVIotK4w2po=
+github.com/tdewolff/parse/v2 v2.8.1/go.mod h1:Hwlni2tiVNKyzR1o6nUs4FOF07URA+JLBLd6dlIXYqo=
+github.com/tdewolff/test v1.0.11/go.mod h1:XPuWBzvdUzhCuxWO1ojpXsyzsA5bFoS3tO/Q3kFuTG8=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
+golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4=
+golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
+google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
+google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
diff --git a/.citools/src/bra/go.mod b/.citools/src/bra/go.mod
index b37f09f62f9..fec1ff55bbb 100644
--- a/.citools/src/bra/go.mod
+++ b/.citools/src/bra/go.mod
@@ -1,6 +1,6 @@
module bra
-go 1.24.4
+go 1.24.5
tool github.com/unknwon/bra
diff --git a/.citools/src/cog/go.mod b/.citools/src/cog/go.mod
index 44a7a920f35..1b0f1246663 100644
--- a/.citools/src/cog/go.mod
+++ b/.citools/src/cog/go.mod
@@ -1,6 +1,6 @@
module cog
-go 1.24.4
+go 1.24.5
tool github.com/grafana/cog/cmd/cli
@@ -42,7 +42,7 @@ require (
github.com/yalue/merged_fs v1.3.0 // indirect
golang.org/x/mod v0.24.0 // indirect
golang.org/x/net v0.40.0 // indirect
- golang.org/x/oauth2 v0.26.0 // indirect
+ golang.org/x/oauth2 v0.30.0 // indirect
golang.org/x/sync v0.14.0 // indirect
golang.org/x/text v0.25.0 // indirect
golang.org/x/tools v0.33.0 // indirect
diff --git a/.citools/src/cog/go.sum b/.citools/src/cog/go.sum
index 4a69777748f..513236e89f4 100644
--- a/.citools/src/cog/go.sum
+++ b/.citools/src/cog/go.sum
@@ -89,8 +89,8 @@ golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=
golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
-golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE=
-golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.27.0 h1:da9Vo7/tDv5RH/7nZDz1eMGS/q1Vv1N/7FCrBhI9I3M=
+golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
diff --git a/.citools/src/cue/go.mod b/.citools/src/cue/go.mod
index f59e9af9ff6..d2b53be05ce 100644
--- a/.citools/src/cue/go.mod
+++ b/.citools/src/cue/go.mod
@@ -1,6 +1,6 @@
module cue
-go 1.24.4
+go 1.24.5
tool cuelang.org/go/cmd/cue
@@ -27,7 +27,7 @@ require (
github.com/tetratelabs/wazero v1.6.0 // indirect
golang.org/x/mod v0.24.0 // indirect
golang.org/x/net v0.40.0 // indirect
- golang.org/x/oauth2 v0.26.0 // indirect
+ golang.org/x/oauth2 v0.30.0 // indirect
golang.org/x/sync v0.14.0 // indirect
golang.org/x/sys v0.33.0 // indirect
golang.org/x/text v0.25.0 // indirect
diff --git a/.citools/src/cue/go.sum b/.citools/src/cue/go.sum
index 58868acedb9..ff7385db2e7 100644
--- a/.citools/src/cue/go.sum
+++ b/.citools/src/cue/go.sum
@@ -57,8 +57,8 @@ golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU=
golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
-golang.org/x/oauth2 v0.26.0 h1:afQXWNNaeC4nvZ0Ed9XvCCzXM6UHJG7iCg0W4fPqSBE=
-golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
+golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
+golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ=
golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
diff --git a/.citools/src/golangci-lint/go.mod b/.citools/src/golangci-lint/go.mod
index 9fcd1645750..e990fc28440 100644
--- a/.citools/src/golangci-lint/go.mod
+++ b/.citools/src/golangci-lint/go.mod
@@ -1,6 +1,6 @@
module golangci-lint
-go 1.24.4
+go 1.24.5
tool github.com/golangci/golangci-lint/v2/cmd/golangci-lint
diff --git a/.citools/src/jb/go.mod b/.citools/src/jb/go.mod
index eec18890a50..05208bc103e 100644
--- a/.citools/src/jb/go.mod
+++ b/.citools/src/jb/go.mod
@@ -1,6 +1,6 @@
module jb
-go 1.24.4
+go 1.24.5
tool github.com/jsonnet-bundler/jsonnet-bundler/cmd/jb
diff --git a/.citools/src/lefthook/go.mod b/.citools/src/lefthook/go.mod
index ba6572071f8..e2e1c1fb600 100644
--- a/.citools/src/lefthook/go.mod
+++ b/.citools/src/lefthook/go.mod
@@ -1,6 +1,6 @@
module lefthook
-go 1.24.4
+go 1.24.5
tool github.com/evilmartians/lefthook
diff --git a/.citools/src/swagger/go.mod b/.citools/src/swagger/go.mod
index 344f0c95653..df5684377c8 100644
--- a/.citools/src/swagger/go.mod
+++ b/.citools/src/swagger/go.mod
@@ -1,6 +1,6 @@
module swagger
-go 1.24.4
+go 1.24.5
tool github.com/go-swagger/go-swagger/cmd/swagger
diff --git a/.drone.star b/.drone.star
index 8cf6438940c..a430359e27d 100644
--- a/.drone.star
+++ b/.drone.star
@@ -7,7 +7,6 @@
This module returns a Drone configuration including pipelines and secrets.
"""
-load("scripts/drone/events/cron.star", "cronjobs")
load("scripts/drone/events/main.star", "main_pipelines")
load("scripts/drone/events/pr.star", "pr_pipelines")
load(
@@ -37,6 +36,5 @@ def main(_ctx):
publish_npm_pipelines() +
publish_packages_pipeline() +
rgm() +
- cronjobs() +
secrets()
)
diff --git a/.drone.yml b/.drone.yml
index bf621c24a1e..345aae7d4bd 100644
--- a/.drone.yml
+++ b/.drone.yml
@@ -25,7 +25,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: compile-build-cmd
- commands:
- ./bin/build verify-drone
@@ -75,7 +75,7 @@ steps:
- go install github.com/bazelbuild/buildtools/buildifier@latest
- buildifier --lint=warn -mode=check -r .
depends_on: []
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: lint-starlark
trigger:
event:
@@ -140,7 +140,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: compile-build-cmd
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -150,7 +150,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -159,7 +159,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on: []
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: verify-gen-jsonnet
- commands:
- yarn install --immutable || yarn install --immutable
@@ -210,7 +210,7 @@ steps:
environment:
_EXPERIMENTAL_DAGGER_CLOUD_TOKEN:
from_secret: dagger_token
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: rgm-package
pull: always
volumes:
@@ -289,7 +289,7 @@ steps:
- commands:
- npx wait-on@7.0.1 http://$HOST:$PORT
- yarn playwright install --with-deps chromium
- - yarn e2e:playwright --grep @plugins
+ - GRAFANA_URL=http://$HOST:$PORT yarn e2e:playwright --grep @plugins
depends_on:
- grafana-server
- build-test-plugins
@@ -472,7 +472,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: verify-gen-cue
trigger:
event:
@@ -542,7 +542,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: verify-gen-cue
trigger:
branch: main
@@ -609,7 +609,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: compile-build-cmd
- commands:
- '# It is required that code generated from Thema/CUE be committed and in sync
@@ -619,7 +619,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-cue
depends_on: []
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: verify-gen-cue
- commands:
- '# It is required that generated jsonnet is committed and in sync with its inputs.'
@@ -628,7 +628,7 @@ steps:
- apk add --update make
- CODEGEN_VERIFY=1 make gen-jsonnet
depends_on: []
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: verify-gen-jsonnet
- commands:
- yarn install --immutable || yarn install --immutable
@@ -678,7 +678,7 @@ steps:
environment:
_EXPERIMENTAL_DAGGER_CLOUD_TOKEN:
from_secret: dagger_token
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: rgm-package
pull: always
volumes:
@@ -761,7 +761,7 @@ steps:
- commands:
- npx wait-on@7.0.1 http://$HOST:$PORT
- yarn playwright install --with-deps chromium
- - yarn e2e:playwright --grep @plugins
+ - GRAFANA_URL=http://$HOST:$PORT yarn e2e:playwright --grep @plugins
depends_on:
- grafana-server
- build-test-plugins
@@ -1156,7 +1156,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: compile-build-cmd
- commands:
- ./bin/build artifacts docker fetch --edition oss
@@ -1286,7 +1286,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: compile-build-cmd
- commands:
- ./bin/build artifacts docker fetch --edition oss
@@ -1427,7 +1427,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: compile-build-cmd
- commands:
- ./bin/build artifacts packages --artifacts-editions=oss --tag $${DRONE_TAG} --src-bucket
@@ -1519,7 +1519,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: compile-build-cmd
- commands:
- yarn install --immutable || yarn install --immutable
@@ -1619,7 +1619,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: compile-build-cmd
- depends_on:
- compile-build-cmd
@@ -1716,7 +1716,7 @@ steps:
depends_on: []
environment:
CGO_ENABLED: 0
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: compile-build-cmd
- commands:
- ./bin/build publish grafana-com --edition oss ${DRONE_TAG}
@@ -1790,7 +1790,7 @@ steps:
STORYBOOK_DESTINATION:
from_secret: rgm_storybook_destination
UBUNTU_BASE: ubuntu:22.04
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: rgm-build
pull: always
volumes:
@@ -1867,7 +1867,7 @@ steps:
STORYBOOK_DESTINATION:
from_secret: rgm_storybook_destination
UBUNTU_BASE: ubuntu:22.04
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: rgm-build
pull: always
volumes:
@@ -1986,7 +1986,7 @@ steps:
STORYBOOK_DESTINATION:
from_secret: rgm_storybook_destination
UBUNTU_BASE: ubuntu:22.04
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: rgm-build
pull: always
volumes:
@@ -2093,7 +2093,7 @@ steps:
STORYBOOK_DESTINATION:
from_secret: rgm_storybook_destination
UBUNTU_BASE: ubuntu:22.04
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: rgm-build
pull: always
volumes:
@@ -2239,7 +2239,7 @@ steps:
STORYBOOK_DESTINATION:
from_secret: rgm_storybook_destination
UBUNTU_BASE: ubuntu:22.04
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: rgm-publish
pull: always
volumes:
@@ -2369,7 +2369,7 @@ steps:
STORYBOOK_DESTINATION:
from_secret: rgm_storybook_destination
UBUNTU_BASE: ubuntu:22.04
- image: golang:1.24.4-alpine
+ image: golang:1.24.5-alpine
name: rgm-build
pull: always
volumes:
@@ -2426,367 +2426,6 @@ volumes:
- name: github-app
temp: {}
---
-clone:
- retries: 3
-kind: pipeline
-name: scan-grafana/grafana:latest-image
-platform:
- arch: amd64
- os: linux
-steps:
-- commands:
- - echo $${GCR_CREDENTIALS} | docker login -u _json_key --password-stdin https://us.gcr.io
- environment:
- GCR_CREDENTIALS:
- from_secret: gcr_credentials
- image: docker:dind
- name: authenticate-gcr
- volumes:
- - name: docker
- path: /var/run/docker.sock
- - name: config
- path: /root/.docker/
-- commands:
- - trivy image --exit-code 0 --severity UNKNOWN,LOW,MEDIUM grafana/grafana:latest
- depends_on:
- - authenticate-gcr
- image: aquasec/trivy:0.21.0
- name: scan-unknown-low-medium-vulnerabilities
- volumes:
- - name: docker
- path: /var/run/docker.sock
- - name: config
- path: /root/.docker/
-- commands:
- - trivy image --exit-code 1 --severity HIGH,CRITICAL grafana/grafana:latest
- depends_on:
- - authenticate-gcr
- environment:
- GOOGLE_APPLICATION_CREDENTIALS:
- from_secret: gcr_credentials_json
- image: aquasec/trivy:0.21.0
- name: scan-high-critical-vulnerabilities
- volumes:
- - name: docker
- path: /var/run/docker.sock
- - name: config
- path: /root/.docker/
-- image: plugins/slack
- name: slack-notify-failure
- settings:
- channel: grafana-backend-ops
- template: 'Nightly docker image scan job for grafana/grafana:latest failed: {{build.link}}'
- webhook:
- from_secret: slack_webhook_backend
- when:
- status: failure
-trigger:
- cron: nightly
- event: cron
-type: docker
-volumes:
-- host:
- path: /var/run/docker.sock
- name: docker
-- name: config
- temp: {}
----
-clone:
- retries: 3
-kind: pipeline
-name: scan-grafana/grafana:main-image
-platform:
- arch: amd64
- os: linux
-steps:
-- commands:
- - echo $${GCR_CREDENTIALS} | docker login -u _json_key --password-stdin https://us.gcr.io
- environment:
- GCR_CREDENTIALS:
- from_secret: gcr_credentials
- image: docker:dind
- name: authenticate-gcr
- volumes:
- - name: docker
- path: /var/run/docker.sock
- - name: config
- path: /root/.docker/
-- commands:
- - trivy image --exit-code 0 --severity UNKNOWN,LOW,MEDIUM grafana/grafana:main
- depends_on:
- - authenticate-gcr
- image: aquasec/trivy:0.21.0
- name: scan-unknown-low-medium-vulnerabilities
- volumes:
- - name: docker
- path: /var/run/docker.sock
- - name: config
- path: /root/.docker/
-- commands:
- - trivy image --exit-code 1 --severity HIGH,CRITICAL grafana/grafana:main
- depends_on:
- - authenticate-gcr
- environment:
- GOOGLE_APPLICATION_CREDENTIALS:
- from_secret: gcr_credentials_json
- image: aquasec/trivy:0.21.0
- name: scan-high-critical-vulnerabilities
- volumes:
- - name: docker
- path: /var/run/docker.sock
- - name: config
- path: /root/.docker/
-- image: plugins/slack
- name: slack-notify-failure
- settings:
- channel: grafana-backend-ops
- template: 'Nightly docker image scan job for grafana/grafana:main failed: {{build.link}}'
- webhook:
- from_secret: slack_webhook_backend
- when:
- status: failure
-trigger:
- cron: nightly
- event: cron
-type: docker
-volumes:
-- host:
- path: /var/run/docker.sock
- name: docker
-- name: config
- temp: {}
----
-clone:
- retries: 3
-kind: pipeline
-name: scan-grafana/grafana:latest-ubuntu-image
-platform:
- arch: amd64
- os: linux
-steps:
-- commands:
- - echo $${GCR_CREDENTIALS} | docker login -u _json_key --password-stdin https://us.gcr.io
- environment:
- GCR_CREDENTIALS:
- from_secret: gcr_credentials
- image: docker:dind
- name: authenticate-gcr
- volumes:
- - name: docker
- path: /var/run/docker.sock
- - name: config
- path: /root/.docker/
-- commands:
- - trivy image --exit-code 0 --severity UNKNOWN,LOW,MEDIUM grafana/grafana:latest-ubuntu
- depends_on:
- - authenticate-gcr
- image: aquasec/trivy:0.21.0
- name: scan-unknown-low-medium-vulnerabilities
- volumes:
- - name: docker
- path: /var/run/docker.sock
- - name: config
- path: /root/.docker/
-- commands:
- - trivy image --exit-code 1 --severity HIGH,CRITICAL grafana/grafana:latest-ubuntu
- depends_on:
- - authenticate-gcr
- environment:
- GOOGLE_APPLICATION_CREDENTIALS:
- from_secret: gcr_credentials_json
- image: aquasec/trivy:0.21.0
- name: scan-high-critical-vulnerabilities
- volumes:
- - name: docker
- path: /var/run/docker.sock
- - name: config
- path: /root/.docker/
-- image: plugins/slack
- name: slack-notify-failure
- settings:
- channel: grafana-backend-ops
- template: 'Nightly docker image scan job for grafana/grafana:latest-ubuntu failed:
- {{build.link}}'
- webhook:
- from_secret: slack_webhook_backend
- when:
- status: failure
-trigger:
- cron: nightly
- event: cron
-type: docker
-volumes:
-- host:
- path: /var/run/docker.sock
- name: docker
-- name: config
- temp: {}
----
-clone:
- retries: 3
-kind: pipeline
-name: scan-grafana/grafana:main-ubuntu-image
-platform:
- arch: amd64
- os: linux
-steps:
-- commands:
- - echo $${GCR_CREDENTIALS} | docker login -u _json_key --password-stdin https://us.gcr.io
- environment:
- GCR_CREDENTIALS:
- from_secret: gcr_credentials
- image: docker:dind
- name: authenticate-gcr
- volumes:
- - name: docker
- path: /var/run/docker.sock
- - name: config
- path: /root/.docker/
-- commands:
- - trivy image --exit-code 0 --severity UNKNOWN,LOW,MEDIUM grafana/grafana:main-ubuntu
- depends_on:
- - authenticate-gcr
- image: aquasec/trivy:0.21.0
- name: scan-unknown-low-medium-vulnerabilities
- volumes:
- - name: docker
- path: /var/run/docker.sock
- - name: config
- path: /root/.docker/
-- commands:
- - trivy image --exit-code 1 --severity HIGH,CRITICAL grafana/grafana:main-ubuntu
- depends_on:
- - authenticate-gcr
- environment:
- GOOGLE_APPLICATION_CREDENTIALS:
- from_secret: gcr_credentials_json
- image: aquasec/trivy:0.21.0
- name: scan-high-critical-vulnerabilities
- volumes:
- - name: docker
- path: /var/run/docker.sock
- - name: config
- path: /root/.docker/
-- image: plugins/slack
- name: slack-notify-failure
- settings:
- channel: grafana-backend-ops
- template: 'Nightly docker image scan job for grafana/grafana:main-ubuntu failed:
- {{build.link}}'
- webhook:
- from_secret: slack_webhook_backend
- when:
- status: failure
-trigger:
- cron: nightly
- event: cron
-type: docker
-volumes:
-- host:
- path: /var/run/docker.sock
- name: docker
-- name: config
- temp: {}
----
-clone:
- retries: 3
-kind: pipeline
-name: scan-build-test-and-publish-docker-images
-platform:
- arch: amd64
- os: linux
-steps:
-- commands:
- - echo $${GCR_CREDENTIALS} | docker login -u _json_key --password-stdin https://us.gcr.io
- environment:
- GCR_CREDENTIALS:
- from_secret: gcr_credentials
- image: docker:dind
- name: authenticate-gcr
- volumes:
- - name: docker
- path: /var/run/docker.sock
- - name: config
- path: /root/.docker/
-- commands:
- - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM docker:27-cli
- - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM alpine/git:2.40.1
- - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM golang:1.24.4-alpine
- - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM node:22.16.0-alpine
- - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM node:22-bookworm
- - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM google/cloud-sdk:431.0.0
- - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM grafana/grafana-ci-deploy:1.3.3
- - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM alpine:3.21.3
- - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM ubuntu:22.04
- - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM byrnedo/alpine-curl:0.1.8
- - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM plugins/slack
- - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM us.gcr.io/kubernetes-dev/package-publish:latest
- - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM grafana/drone-downstream
- - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM grafana/docker-puppeteer:1.1.0
- - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM grafana/docs-base:latest
- - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM cypress/included:14.3.2
- - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM jwilder/dockerize:0.6.1
- - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM us-docker.pkg.dev/grafanalabs-global/docker-deployment-tools-prod/github-app-secret-writer:2024-11-05-v11688112090.1-83920c59
- depends_on:
- - authenticate-gcr
- image: aquasec/trivy:0.21.0
- name: scan-unknown-low-medium-vulnerabilities
- volumes:
- - name: docker
- path: /var/run/docker.sock
- - name: config
- path: /root/.docker/
-- commands:
- - trivy --exit-code 1 --severity HIGH,CRITICAL docker:27-cli
- - trivy --exit-code 1 --severity HIGH,CRITICAL alpine/git:2.40.1
- - trivy --exit-code 1 --severity HIGH,CRITICAL golang:1.24.4-alpine
- - trivy --exit-code 1 --severity HIGH,CRITICAL node:22.16.0-alpine
- - trivy --exit-code 1 --severity HIGH,CRITICAL node:22-bookworm
- - trivy --exit-code 1 --severity HIGH,CRITICAL google/cloud-sdk:431.0.0
- - trivy --exit-code 1 --severity HIGH,CRITICAL grafana/grafana-ci-deploy:1.3.3
- - trivy --exit-code 1 --severity HIGH,CRITICAL alpine:3.21.3
- - trivy --exit-code 1 --severity HIGH,CRITICAL ubuntu:22.04
- - trivy --exit-code 1 --severity HIGH,CRITICAL byrnedo/alpine-curl:0.1.8
- - trivy --exit-code 1 --severity HIGH,CRITICAL plugins/slack
- - trivy --exit-code 1 --severity HIGH,CRITICAL us.gcr.io/kubernetes-dev/package-publish:latest
- - trivy --exit-code 1 --severity HIGH,CRITICAL grafana/drone-downstream
- - trivy --exit-code 1 --severity HIGH,CRITICAL grafana/docker-puppeteer:1.1.0
- - trivy --exit-code 1 --severity HIGH,CRITICAL grafana/docs-base:latest
- - trivy --exit-code 1 --severity HIGH,CRITICAL cypress/included:14.3.2
- - trivy --exit-code 1 --severity HIGH,CRITICAL jwilder/dockerize:0.6.1
- - trivy --exit-code 1 --severity HIGH,CRITICAL us-docker.pkg.dev/grafanalabs-global/docker-deployment-tools-prod/github-app-secret-writer:2024-11-05-v11688112090.1-83920c59
- depends_on:
- - authenticate-gcr
- environment:
- GOOGLE_APPLICATION_CREDENTIALS:
- from_secret: gcr_credentials_json
- image: aquasec/trivy:0.21.0
- name: scan-high-critical-vulnerabilities
- volumes:
- - name: docker
- path: /var/run/docker.sock
- - name: config
- path: /root/.docker/
-- image: plugins/slack
- name: slack-notify-failure
- settings:
- channel: grafana-backend-ops
- template: 'Nightly docker image scan job for build-images failed: {{build.link}}'
- webhook:
- from_secret: slack_webhook_backend
- when:
- status: failure
-trigger:
- cron: nightly
- event: cron
-type: docker
-volumes:
-- host:
- path: /var/run/docker.sock
- name: docker
-- name: config
- temp: {}
----
get:
name: app-id
path: ci/data/repo/grafana/grafana/github-app
@@ -2986,6 +2625,6 @@ kind: secret
name: gcr_credentials
---
kind: signature
-hmac: d20f1d6e2e8347701f82114ad352f53db57dc95b5b3831941fa93d063a92b9d8
+hmac: aef043aae7394d3160a7147c8b57599bf1a2f4ba5c596ffb795a0e6a049c73a6
...
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index ecd61d20be0..3329738f79c 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -84,6 +84,7 @@
/apps/investigations/ @fcjack @matryer @svennergr
/apps/advisor/ @grafana/plugins-platform-backend
/apps/iam/ @grafana/access-squad
+/apps/sdk.mk @grafana/grafana-app-platform-squad
/pkg/api/ @grafana/grafana-backend-group
/pkg/apis/ @grafana/grafana-app-platform-squad
/pkg/apis/query @grafana/grafana-datasources-core-services
@@ -150,6 +151,7 @@
/pkg/services/hooks/ @grafana/grafana-backend-group
/pkg/services/kmsproviders/ @grafana/grafana-operator-experience-squad
/pkg/services/licensing/ @grafana/grafana-operator-experience-squad
+/pkg/services/mtdsclient/ @grafana/grafana-datasources-core-services
/pkg/services/navtree/ @grafana/grafana-backend-group
/pkg/services/notifications/ @grafana/grafana-backend-group
/pkg/services/org/ @grafana/grafana-backend-group
@@ -157,7 +159,7 @@
/pkg/services/preference/ @grafana/grafana-backend-group
/pkg/services/provisioning/ @grafana/grafana-search-and-storage
/pkg/services/provisioning/alerting/ @grafana/alerting-backend
-/pkg/services/query/ @grafana/grafana-app-platform-squad
+/pkg/services/query/ @grafana/grafana-datasources-core-services
/pkg/services/queryhistory/ @grafana/observability-traces-and-profiling
/pkg/services/quota/ @grafana/grafana-search-and-storage
/pkg/services/screenshot/ @grafana/grafana-backend-group
@@ -178,8 +180,10 @@
/pkg/setting/ @grafana/grafana-backend-services-squad
/pkg/tests/ @grafana/grafana-backend-services-squad
/pkg/tests/apis/ @grafana/grafana-app-platform-squad
-/pkg/tests/apis/query @grafana/grafana-datasources-core-services
/pkg/tests/apis/alerting @grafana/grafana-app-platform-squad @grafana/alerting-backend
+/pkg/tests/apis/features @grafana/grafana-backend-services-squad
+/pkg/tests/apis/folder @grafana/grafana-search-and-storage
+/pkg/tests/apis/iam @grafana/identity-access-team
/pkg/tests/api/correlations/ @grafana/datapro
/pkg/tsdb/grafanads/ @grafana/grafana-backend-group
/pkg/tsdb/opentsdb/ @grafana/partner-datasources
@@ -408,11 +412,92 @@
/e2e-playwright/test-plugins/grafana-extensionstest-app/ @grafana/plugins-platform-frontend
# Packages
-/packages/ @grafana/grafana-frontend-platform @grafana/plugins-platform-frontend
+/packages/README.md @grafana/grafana-frontend-platform
+/packages/rollup.config.parts.ts @grafana/frontend-ops
+
+# @grafana/alerting
+/packages/grafana-alerting/ @grafana/alerting-frontend
+
+# @grafana/data
+/packages/grafana-data/CHANGELOG.md @grafana/grafana-frontend-platform
+/packages/grafana-data/LICENSE_APACHE2 @grafana/grafana-frontend-platform
+/packages/grafana-data/README.md @grafana/grafana-frontend-platform
+/packages/grafana-data/package.json @grafana/grafana-frontend-platform
+/packages/grafana-data/project.json @grafana/grafana-frontend-platform
+/packages/grafana-data/rollup.config.ts @grafana/grafana-frontend-platform
+/packages/grafana-data/src/index.ts @grafana/grafana-frontend-platform @grafana/plugins-platform-frontend
+/packages/grafana-data/src/internal/index.ts @grafana/grafana-frontend-platform @grafana/plugins-platform-frontend
+/packages/grafana-data/src/unstable.ts @grafana/grafana-frontend-platform @grafana/plugins-platform-frontend
+/packages/grafana-data/tsconfig.build.json @grafana/grafana-frontend-platform
+/packages/grafana-data/tsconfig.json @grafana/grafana-frontend-platform
+/packages/grafana-data/test/ @grafana/grafana-frontend-platform
+/packages/grafana-data/typings/ @grafana/grafana-frontend-platform
+
/packages/grafana-data/src/**/*logs* @grafana/observability-logs
+/packages/grafana-data/src/context/plugins/ @grafana/plugins-platform-frontend
+/packages/grafana-data/src/dataframe/ @grafana/dataviz-squad
+/packages/grafana-data/src/datetime/ @grafana/grafana-frontend-platform
+/packages/grafana-data/src/events/ @grafana/grafana-frontend-platform
+/packages/grafana-data/src/field/ @grafana/dashboards-squad
+/packages/grafana-data/src/geo/ @grafana/dataviz-squad
+/packages/grafana-data/src/monaco/ @grafana/partner-datasources
+/packages/grafana-data/src/panel/ @grafana/dashboards-squad
+/packages/grafana-data/src/query/ @grafana/grafana-datasources-core-services
+/packages/grafana-data/src/rbac/ @grafana/access-squad
+/packages/grafana-data/src/table/ @grafana/dataviz-squad
+/packages/grafana-data/src/text/ @grafana/dataviz-squad
+/packages/grafana-data/src/themes/ @grafana/grafana-frontend-platform
/packages/grafana-data/src/transformations/ @grafana/datapro
+/packages/grafana-data/src/types/ @grafana/grafana-frontend-platform
+/packages/grafana-data/src/utils/__snapshots__/ @grafanabot
+/packages/grafana-data/src/utils/anyToNumber.ts @grafana/grafana-frontend-platform
+/packages/grafana-data/src/utils/arrayUtils* @grafana/grafana-frontend-platform
+/packages/grafana-data/src/utils/binaryOperators.ts @grafana/datapro
+/packages/grafana-data/src/utils/csv* @grafana/dataviz-squad
+/packages/grafana-data/src/utils/dataLinks* @grafana/dashboards-squad
+/packages/grafana-data/src/utils/datasource.ts @grafana/grafana-datasources-core-services
+/packages/grafana-data/src/utils/docs.ts @grafana/grafana-frontend-platform
+/packages/grafana-data/src/utils/deprecationWarning* @grafana/grafana-frontend-platform
+/packages/grafana-data/src/utils/featureToggles.ts @grafana/grafana-frontend-platform
+/packages/grafana-data/src/utils/fieldParser.ts @grafana/dataviz-squad
+/packages/grafana-data/src/utils/flotPairs* @grafana/dataviz-squad
+/packages/grafana-data/src/utils/fuzzySearch* @grafana/grafana-search-navigate-organise
+/packages/grafana-data/src/utils/labels* @grafana/observability-logs
+/packages/grafana-data/src/utils/legend* @grafana/oss-big-tent
+/packages/grafana-data/src/utils/location* @grafana/grafana-search-navigate-organise
+/packages/grafana-data/src/utils/LocalStorageValueProvider.tsx @grafana/grafana-frontend-platform
+/packages/grafana-data/src/utils/makeClassES5Compatible.ts @grafana/plugins-platform-frontend
+/packages/grafana-data/src/utils/matchPluginId* @grafana/plugins-platform-frontend
+/packages/grafana-data/src/utils/namedColorsPalette* @grafana/grafana-frontend-platform
+/packages/grafana-data/src/utils/nodeGraph.ts @grafana/observability-traces-and-profiling
+/packages/grafana-data/src/utils/numbers.ts @grafana/dataviz-squad
+/packages/grafana-data/src/utils/object.ts @grafana/grafana-frontend-platform
+/packages/grafana-data/src/utils/OptionsUIBuilders.ts @grafana/dashboards-squad
+/packages/grafana-data/src/utils/Registry* @grafana/grafana-frontend-platform
+/packages/grafana-data/src/utils/selectUtils.ts @grafana/grafana-frontend-platform
+/packages/grafana-data/src/utils/series* @grafana/dataviz-squad
+/packages/grafana-data/src/utils/store* @grafana/grafana-frontend-platform
+/packages/grafana-data/src/utils/testdata/ @grafana/dataviz-squad
+/packages/grafana-data/src/utils/tests/ @grafana/grafana-frontend-platform
+/packages/grafana-data/src/utils/throwIfAngular* @grafana/plugins-platform-frontend
+/packages/grafana-data/src/utils/unaryOperators.ts @grafana/datapro
+/packages/grafana-data/src/utils/url* @grafana/grafana-search-navigate-organise
+/packages/grafana-data/src/utils/valueMappings* @grafana/dashboards-squad
+/packages/grafana-data/src/utils/variables.ts @grafana/plugins-platform-frontend
+/packages/grafana-data/src/utils/withLoadingIndicator.ts @grafana/access-squad @grafana/alerting-frontend
+/packages/grafana-data/src/valueFormats/ @grafana/dashboards-squad
+/packages/grafana-data/src/vector/ @grafana/dataviz-squad
+
+# @grafana/e2e-selectors
/packages/grafana-e2e-selectors/ @grafana/grafana-frontend-platform
+
+# @grafana/eslint-plugin
+/packages/grafana-eslint-rules/ @grafana/grafana-frontend-platform
+
+# @grafana/flamegraph
/packages/grafana-flamegraph/ @grafana/observability-traces-and-profiling
+
+# @grafana/o11y-ds-frontend
/packages/grafana-o11y-ds-frontend/ @grafana/observability-logs
/packages/grafana-o11y-ds-frontend/src/IntervalInput/ @grafana/observability-traces-and-profiling
/packages/grafana-o11y-ds-frontend/src/NodeGraph/ @grafana/observability-traces-and-profiling
@@ -421,16 +506,104 @@
/packages/grafana-o11y-ds-frontend/src/TraceToLogs/ @grafana/observability-traces-and-profiling
/packages/grafana-o11y-ds-frontend/src/TraceToMetrics/ @grafana/observability-traces-and-profiling
/packages/grafana-o11y-ds-frontend/src/TraceToProfiles/ @grafana/observability-traces-and-profiling
+
+# @grafana/plugin-configs
/packages/grafana-plugin-configs/ @grafana/plugins-platform-frontend
+
+# @grafana/prometheus
/packages/grafana-prometheus/ @grafana/oss-big-tent
-/packages/grafana-schema/src/**/*canvas* @grafana/dataviz-squad
-/packages/grafana-schema/src/**/*tempo* @grafana/observability-traces-and-profiling
+
+# @grafana/runtime
+/packages/grafana-runtime/CHANGELOG.md @grafana/grafana-frontend-platform
+/packages/grafana-runtime/LICENSE_APACHE2 @grafana/grafana-frontend-platform
+/packages/grafana-runtime/README.md @grafana/grafana-frontend-platform
+/packages/grafana-runtime/package.json @grafana/grafana-frontend-platform
+/packages/grafana-runtime/project.json @grafana/grafana-frontend-platform
+/packages/grafana-runtime/rollup.config.ts @grafana/grafana-frontend-platform
+/packages/grafana-runtime/src/index.ts @grafana/grafana-frontend-platform @grafana/plugins-platform-frontend
+/packages/grafana-runtime/src/internal/index.ts @grafana/grafana-frontend-platform @grafana/plugins-platform-frontend
+/packages/grafana-runtime/src/unstable.ts @grafana/grafana-frontend-platform @grafana/plugins-platform-frontend
+/packages/grafana-runtime/tsconfig.build.json @grafana/grafana-frontend-platform
+/packages/grafana-runtime/tsconfig.json @grafana/grafana-frontend-platform
+
+/packages/grafana-runtime/src/analytics @grafana/grafana-frontend-platform
+/packages/grafana-runtime/src/analytics/plugins @grafana/plugins-platform-frontend
+/packages/grafana-runtime/src/components/DataSourcePicker* @grafana/grafana-frontend-platform
+/packages/grafana-runtime/src/components/EmbeddedDashboard.tsx @grafana/dashboards-squad
+/packages/grafana-runtime/src/components/FolderPicker.tsx @grafana/grafana-frontend-platform
+/packages/grafana-runtime/src/components/PanelRenderer.tsx @grafana/dashboards-squad
+/packages/grafana-runtime/src/components/PanelDataErrorView.tsx @grafana/dashboards-squad
+/packages/grafana-runtime/src/components/PluginPage.tsx @grafana/grafana-search-navigate-organise
+/packages/grafana-runtime/src/components/QueryEditorWithMigration* @grafana/plugins-platform-frontend @grafana/plugins-platform-backend
+/packages/grafana-runtime/src/config.ts @grafana/grafana-frontend-platform
+/packages/grafana-runtime/src/services/ @grafana/grafana-frontend-platform
+/packages/grafana-runtime/src/services/pluginExtensions @grafana/plugins-platform-frontend
+/packages/grafana-runtime/src/services/CorrelationsService.ts @grafana/datapro
+/packages/grafana-runtime/src/services/LocationService.test.tsx @grafana/grafana-search-navigate-organise
+/packages/grafana-runtime/src/services/LocationService.tsx @grafana/grafana-search-navigate-organise
+/packages/grafana-runtime/src/services/LocationSrv.ts @grafana/grafana-search-navigate-organise
+/packages/grafana-runtime/src/services/live.ts @grafana/dashboards-squad
+/packages/grafana-runtime/src/utils/chromeHeaderHeight.ts @grafana/grafana-search-navigate-organise
+/packages/grafana-runtime/src/utils/DataSourceWithBackend* @grafana/grafana-datasources-core-services
+/packages/grafana-runtime/src/utils/licensing.ts @grafana/grafana-operator-experience-squad
+/packages/grafana-runtime/src/utils/logging.ts @grafana/grafana-frontend-platform
+/packages/grafana-runtime/src/utils/migrationHandler* @grafana/plugins-platform-frontend @grafana/plugins-platform-backend
+/packages/grafana-runtime/src/utils/plugin.ts @grafana/plugins-platform-frontend
+/packages/grafana-runtime/src/utils/publicDashboardQueryHandler.ts @grafana/grafana-operator-experience-squad
+/packages/grafana-runtime/src/utils/queryResponse* @grafana/grafana-datasources-core-services
+/packages/grafana-runtime/src/utils/rbac.ts @grafana/identity-access-team
+/packages/grafana-runtime/src/utils/returnToPrevious.ts @grafana/grafana-search-navigate-organise
+/packages/grafana-runtime/src/utils/toDataQueryError.ts @grafana/grafana-datasources-core-services
+/packages/grafana-runtime/src/utils/userStorage* @grafana/plugins-platform-frontend @grafana/grafana-frontend-platform
+
+# @grafana/schema
+/packages/grafana-schema/ @grafana/grafana-app-platform-squad
+
+/packages/grafana-schema/src/**/annotationslist @grafana/dashboards-squad
+/packages/grafana-schema/src/**/azuremonitor @grafana/partner-datasources
+/packages/grafana-schema/src/**/barchart @grafana/dataviz-squad
+/packages/grafana-schema/src/**/bargauge @grafana/dataviz-squad
+/packages/grafana-schema/src/**/candlestick @grafana/dataviz-squad
+/packages/grafana-schema/src/**/canvas @grafana/dataviz-squad
+/packages/grafana-schema/src/**/cloudwatch @grafana/aws-datasources
+/packages/grafana-schema/src/**/dashboard @grafana/dashboards-squad
+/packages/grafana-schema/src/**/dashboardlist @grafana/grafana-search-navigate-organise
+/packages/grafana-schema/src/**/datagrid @grafana/dataviz-squad
+/packages/grafana-schema/src/**/debug @ryantxu
+/packages/grafana-schema/src/**/elasticsearch @grafana/partner-datasources
+/packages/grafana-schema/src/**/gauge @grafana/dataviz-squad
+/packages/grafana-schema/src/**/geomap @grafana/dataviz-squad
+/packages/grafana-schema/src/**/googlecloudmonitoring @grafana/partner-datasources
+/packages/grafana-schema/src/**/grafanapyroscope @grafana/observability-traces-and-profiling
+/packages/grafana-schema/src/**/heatmap @grafana/dataviz-squad
+/packages/grafana-schema/src/**/histogram @grafana/dataviz-squad
+/packages/grafana-schema/src/**/librarypanel @grafana/sharing-squad
+/packages/grafana-schema/src/**/logs @grafana/observability-logs
+/packages/grafana-schema/src/**/logsnew @grafana/observability-logs
+/packages/grafana-schema/src/**/loki @grafana/oss-big-tent @grafana/observability-logs
+/packages/grafana-schema/src/**/news @grafana/dataviz-squad
+/packages/grafana-schema/src/**/nodegraph @grafana/observability-traces-and-profiling @grafana/app-o11y-visualizations
+/packages/grafana-schema/src/**/parca @grafana/oss-big-tent
+/packages/grafana-schema/src/**/piechart @grafana/dataviz-squad
+/packages/grafana-schema/src/**/publicdashboard @grafana/sharing-squad
+/packages/grafana-schema/src/**/stat @grafana/dataviz-squad
+/packages/grafana-schema/src/**/statetimeline @grafana/dataviz-squad
+/packages/grafana-schema/src/**/statushistory @grafana/dataviz-squad
+/packages/grafana-schema/src/**/table @grafana/dataviz-squad
+/packages/grafana-schema/src/**/tempo @grafana/observability-traces-and-profiling
+/packages/grafana-schema/src/**/text @grafana/dataviz-squad
+/packages/grafana-schema/src/**/timeseries @grafana/dataviz-squad
+/packages/grafana-schema/src/**/trend @grafana/dataviz-squad
+/packages/grafana-schema/src/**/xychart @grafana/dataviz-squad
+/packages/grafana-schema/src/**/xychart2 @grafana/dataviz-squad
+
+# @grafana/sql
/packages/grafana-sql/ @grafana/partner-datasources @grafana/oss-big-tent
-/packages/grafana-ui/.storybook/ @grafana/grafana-frontend-platform
-/packages/grafana-ui/src/components/ @grafana/grafana-frontend-platform
+
+# @grafana/ui
+/packages/grafana-ui/ @grafana/grafana-frontend-platform
/packages/grafana-ui/src/components/BarGauge/ @grafana/dataviz-squad
/packages/grafana-ui/src/components/DataLinks/ @grafana/dataviz-squad
-/packages/grafana-ui/src/components/DateTimePickers/ @grafana/grafana-frontend-platform
/packages/grafana-ui/src/components/Gauge/ @grafana/dataviz-squad
/packages/grafana-ui/src/components/PluginSignatureBadge/ @grafana/plugins-platform-frontend
/packages/grafana-ui/src/components/Sparkline/ @grafana/grafana-frontend-platform @grafana/app-o11y-visualizations
@@ -445,9 +618,13 @@
/packages/grafana-ui/src/graveyard/Graph/ @grafana/dataviz-squad
/packages/grafana-ui/src/graveyard/GraphNG/ @grafana/dataviz-squad
/packages/grafana-ui/src/graveyard/TimeSeries/ @grafana/dataviz-squad
-/packages/grafana-ui/src/utils/storybook/ @grafana/grafana-frontend-platform
-/packages/grafana-alerting/ @grafana/alerting-frontend
+/packages/grafana-ui/tsconfig.build.json @grafana/frontend-ops
+/packages/grafana-ui/tsconfig.json @grafana/frontend-ops
+
+# @grafana/i18n
/packages/grafana-i18n/ @grafana/grafana-frontend-platform @grafana/plugins-platform-frontend
+
+# @grafana/test-utils
/packages/grafana-test-utils @grafana/grafana-frontend-platform
# root files, mostly frontend
@@ -825,6 +1002,7 @@ embed.go @grafana/grafana-as-code
/.github/workflows/publish-technical-documentation-release.yml @grafana/docs-tooling
/.github/workflows/scripts/json-file-to-job-output.js @grafana/plugins-platform-frontend
/.github/workflows/stale.yml @grafana/grafana-developer-enablement-squad
+/.github/workflows/storybook-a11y.yml @grafana/grafana-frontend-platform
/.github/workflows/storybook-verification.yml @grafana/grafana-frontend-platform
/.github/workflows/storybook-verification-playwright.yml @grafana/grafana-frontend-platform
/.github/workflows/update-make-docs.yml @grafana/docs-tooling
diff --git a/.github/actions/change-detection/action.yml b/.github/actions/change-detection/action.yml
index b8864e985e2..e2c3a6c3b89 100644
--- a/.github/actions/change-detection/action.yml
+++ b/.github/actions/change-detection/action.yml
@@ -47,6 +47,10 @@ runs:
- '.github/actions/checkout/**'
- '**/go.mod'
- '**/go.sum'
+ - 'go.mod'
+ - 'go.sum'
+ - 'go.work'
+ - 'go.work.sum'
- '**.go'
- 'pkg/**'
- '!pkg/**.md'
diff --git a/.github/issue-opened.json b/.github/issue-opened.json
index 276c9464a76..cfb39512bc5 100644
--- a/.github/issue-opened.json
+++ b/.github/issue-opened.json
@@ -4,8 +4,7 @@
"memberOf": {
"org": "grafana"
},
- "noLabels": true,
- "addLabel": "internal",
+ "noLabels": true,
"comment": " please add one or more appropriate labels. Here are some tips:\r\n\r\n- if you are making an issue, TODO, or reminder for yourself or your team, please add one label that best describes the product or feature area. Please also add the issue to your project board. :rocket:\r\n\r\n- if you are making an issue for any other reason (docs typo, you found a bug, etc), please add at least one label that best describes the product or feature that you are discussing (e.g. `area/alerting`, `datasource/loki`, `type/docs`, `type/bug`, etc). [Our issue triage](https://github.com/grafana/grafana/blob/main/contribute/ISSUE_TRIAGE.md#3-categorize-an-issue) doc also provides additional guidance on labeling. :rocket:\r\n\r\n Thank you! :heart:"
}
]
\ No newline at end of file
diff --git a/.github/renovate.json5 b/.github/renovate.json5
index aa28c25a240..37d44d74483 100644
--- a/.github/renovate.json5
+++ b/.github/renovate.json5
@@ -12,6 +12,7 @@
'react-refresh',
"@types/history", // this can be removed entirely when we upgrade history since v5 exposes types directly
+ "cypress", // cypress use is deprecated, we should not bump it anymore
"history", // we should bump this together with react-router-dom (see https://github.com/grafana/grafana/issues/76744)
"react-router", // we should bump this together with history and react-router-dom
"react-router-dom", // we should bump this together with history (see https://github.com/grafana/grafana/issues/76744)
@@ -31,29 +32,41 @@
automerge: true,
matchCurrentVersion: "!/^0/",
matchUpdateTypes: ["patch"],
- matchPackageNames: ["!/^@?storybook/", "!/^@locker/"],
+ matchPackageNames: ["!/^@?storybook/", "!/^@locker/", "!/^@grafana/"],
+ minimumReleaseAge: "7 days",
+ },
+ {
+ automerge: true,
+ matchCurrentVersion: "!/^0/",
+ matchUpdateTypes: ["patch"],
+ matchPackageNames: ["/^@grafana/"],
},
{
extends: ["schedule:monthly"],
groupName: "Storybook updates",
matchPackageNames: ["/^@?storybook/"],
rangeStrategy: "bump",
+ minimumReleaseAge: "7 days",
},
{
groupName: "React Aria",
matchPackageNames: ["@react-aria/{/,}**", "@react-stately/{/,}**"],
+ minimumReleaseAge: "7 days",
},
{
groupName: "Moveable",
matchPackageNames: ["moveable", "react-moveable"],
+ minimumReleaseAge: "7 days",
},
{
groupName: "Slate",
matchPackageNames: ["@types/slate", "@types/slate-react", "slate", "slate-react"],
+ minimumReleaseAge: "7 days",
},
{
groupName: "d3",
matchPackageNames: ["d3{/,}**", "@types/d3{/,}**"],
+ minimumReleaseAge: "7 days",
},
{
groupName: "scenes",
@@ -66,21 +79,25 @@
{
groupName: "visx",
matchPackageNames: ["@visx/{/,}**"],
+ minimumReleaseAge: "7 days",
},
{
groupName: "uLibraries",
matchPackageNames: ["@leeoniya/**", "uplot"],
reviewers: ["leeoniya"],
+ minimumReleaseAge: "7 days",
},
{
groupName: "locker",
reviewers: ["team:grafana/plugins-platform-frontend"],
matchPackageNames: ["@locker/{/,}**"],
+ minimumReleaseAge: "7 days",
},
{
groupName: "augurs",
matchPackageNames: ["@bsull/augurs"],
reviewers: ["sd2k"],
+ minimumReleaseAge: "7 days",
},
{
"matchDepTypes": ["devDependencies"],
diff --git a/.github/workflows/add-to-whats-new.yml b/.github/workflows/add-to-whats-new.yml
index 699c6b7a220..a6a8bb8ea2e 100644
--- a/.github/workflows/add-to-whats-new.yml
+++ b/.github/workflows/add-to-whats-new.yml
@@ -10,7 +10,7 @@ jobs:
permissions:
pull-requests: write
steps:
- - uses: marocchino/sticky-pull-request-comment@d2ad0de260ae8b0235ce059e63f2949ba9e05943 # v2.9.3
+ - uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405 # v2.9.4
with:
message: |
Since you've added the `Add to what's new` label, consider drafting a [What's new note](https://admin.grafana.com/content-admin/#/collections/whats-new/new) for this feature.
diff --git a/.github/workflows/detect-breaking-changes-levitate.yml b/.github/workflows/detect-breaking-changes-levitate.yml
index 85a35c35d67..ea7c12b4428 100644
--- a/.github/workflows/detect-breaking-changes-levitate.yml
+++ b/.github/workflows/detect-breaking-changes-levitate.yml
@@ -271,7 +271,7 @@ jobs:
# Comment on the PR
- name: Comment on PR
if: steps.levitate-run.outputs.exit_code == 1
- uses: marocchino/sticky-pull-request-comment@d2ad0de260ae8b0235ce059e63f2949ba9e05943
+ uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405
with:
header: levitate-breaking-change-comment
number: ${{ github.event.pull_request.number }}
@@ -288,7 +288,7 @@ jobs:
# Remove comment from the PR (no more breaking changes)
- name: Remove comment from PR
if: steps.levitate-run.outputs.exit_code == 0
- uses: marocchino/sticky-pull-request-comment@d2ad0de260ae8b0235ce059e63f2949ba9e05943
+ uses: marocchino/sticky-pull-request-comment@773744901bac0e8cbb5a0dc842800d45e9b2b405
with:
header: levitate-breaking-change-comment
number: ${{ github.event.pull_request.number }}
diff --git a/.github/workflows/issue-opened.yml b/.github/workflows/issue-opened.yml
index 97694bd2d04..80b853d0c69 100644
--- a/.github/workflows/issue-opened.yml
+++ b/.github/workflows/issue-opened.yml
@@ -117,3 +117,41 @@ jobs:
}
env:
SLACK_WEBHOOK_URL: ${{ env.AUTOTRIAGER_SLACK_WEBHOOK_URL }}
+ auto-label-internal-issues:
+ needs: [main]
+ if: github.repository == 'grafana/grafana'
+ runs-on: ubuntu-latest
+ permissions:
+ issues: write
+ id-token: write
+ steps:
+ - name: "Get vault secrets"
+ id: vault-secrets
+ uses: grafana/shared-workflows/actions/get-vault-secrets@main # zizmor: ignore[unpinned-uses]
+ with:
+ # Secrets placed in the ci/repo/grafana/grafana/plugins_platform_issue_triager path in Vault
+ repo_secrets: |
+ GITHUB_APP_ID=plugins_platform_issue_triager_github_bot:app_id
+ GITHUB_APP_PRIVATE_KEY=plugins_platform_issue_triager_github_bot:app_pem
+ - name: Generate token
+ id: generate_token
+ uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2.0.6
+ with:
+ app-id: ${{ env.GITHUB_APP_ID }}
+ private-key: ${{ env.GITHUB_APP_PRIVATE_KEY }}
+ permission-members: read
+ - name: Check if member of grafana org
+ id: check-if-grafana-org-member
+ continue-on-error: true
+ run: gh api https://api.github.com/orgs/grafana/members/${{ env.ACTOR }} >/dev/null 2>&1 && echo "is_grafana_org_member=true" >> "$GITHUB_OUTPUT"
+ env:
+ GH_TOKEN: ${{ steps.generate_token.outputs.token }}
+ ACTOR: ${{ github.actor }}
+ - name: "Auto label internal issues"
+ if: steps.check-if-grafana-org-member.outputs.is_grafana_org_member == 'true' || github.event.issue.author_association == 'MEMBER' || github.event.issue.author_association == 'OWNER'
+ run: gh issue edit "$NUMBER" --add-label "$LABELS"
+ env:
+ GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ GH_REPO: ${{ github.repository }}
+ NUMBER: ${{ github.event.issue.number }}
+ LABELS: internal
\ No newline at end of file
diff --git a/.github/workflows/pr-e2e-tests.yml b/.github/workflows/pr-e2e-tests.yml
index 5e7d116d0c2..215a4016344 100644
--- a/.github/workflows/pr-e2e-tests.yml
+++ b/.github/workflows/pr-e2e-tests.yml
@@ -286,6 +286,7 @@ jobs:
/home/bench/tests/playwright-results.json
- name: Upload HTML report
+ id: upload-html
uses: actions/upload-artifact@v4
with:
name: playwright-html-${{ github.run_number }}
@@ -304,10 +305,13 @@ jobs:
- name: Show test results
env:
FAILED: ${{ steps.check-jobs.outputs.any-failed }}
+ REPORT_URL: ${{ steps.upload-html.outputs.artifact-url }}
# sed removes the leading `../../src/` from the paths
run: |
- npx playwright merge-reports --reporter list ./all-blob-reports | sed 's|\(\.\./\)\{1,\}src/|/|g'
+ npx playwright merge-reports --reporter list ./blobs | sed 's|\(\.\./\)\{1,\}src/|/|g'
if [ "$FAILED" = "true" ]; then
+ echo ""
+ echo "Download the test report from $REPORT_URL"
exit 1
fi
diff --git a/.github/workflows/pr-go-workspace-check.yml b/.github/workflows/pr-go-workspace-check.yml
index f7b148ac83d..91dc3037f11 100644
--- a/.github/workflows/pr-go-workspace-check.yml
+++ b/.github/workflows/pr-go-workspace-check.yml
@@ -4,18 +4,31 @@ on:
workflow_dispatch:
pull_request:
branches: [main]
- paths:
- - .github/workflows/pr-go-workspace-check.yml
- - go.mod
- - go.sum
- - go.work
- - go.work.sum
- - '**/go.mod'
- - '**/go.sum'
- - '**.go'
+
+permissions: {}
jobs:
- check:
+ detect-changes:
+ name: Detect whether code changed
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ outputs:
+ changed: ${{ steps.detect-changes.outputs.backend }}
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ persist-credentials: true # required to get more history in the changed-files action
+ fetch-depth: 2
+ - name: Detect changes
+ id: detect-changes
+ uses: ./.github/actions/change-detection
+ with:
+ self: .github/workflows/pr-go-workspace-check.yml
+
+ check-workspace:
+ needs: detect-changes
+ if: needs.detect-changes.outputs.changed == 'true'
name: Go Workspace Check
runs-on: ubuntu-latest
@@ -47,6 +60,8 @@ jobs:
run: ./scripts/go-workspace/validate-dockerfile.sh
check-wire:
+ needs: detect-changes
+ if: needs.detect-changes.outputs.changed == 'true'
name: Check Wire Changes
runs-on: ubuntu-latest
@@ -114,3 +129,29 @@ jobs:
fi
exit 1
fi
+
+ # This is the job that is actually required by rulesets.
+ # We want to only require one job instead of all the individual tests.
+ # Future work also allows us to start skipping some tests based on changed files.
+ required-go-workspace-check:
+ needs:
+ - check-workspace
+ - check-wire
+ # always() is the best function here.
+ # success() || failure() will skip this function if any need is also skipped.
+ # That means conditional jobs will fail the entire requirement check.
+ if: always()
+
+ name: All Go Workspace Checks complete
+ runs-on: ubuntu-latest
+ steps:
+ - name: Check the checks
+ env:
+ NEEDS: ${{ toJson(needs) }}
+ run: |
+ FAILURES="$(echo "$NEEDS" | jq 'with_entries(select(.value.result == "failure")) | map_values(.result)')"
+ echo "$FAILURES"
+ if [ "$(echo "$FAILURES" | jq '. | length')" != "0" ]; then
+ exit 1
+ fi
+ echo "All OK!"
diff --git a/.github/workflows/release-build.yml b/.github/workflows/release-build.yml
index 35b8a219d62..fda8533dc0e 100644
--- a/.github/workflows/release-build.yml
+++ b/.github/workflows/release-build.yml
@@ -1,6 +1,10 @@
name: Build Release Packages
on:
workflow_dispatch:
+ schedule:
+ # Every weeknight at midnight
+ # "Scheduled workflows will only run on the default branch." (docs.github.com)
+ - cron: "0 0 * * 1-5"
push:
branches:
- release-*.*.*
@@ -96,8 +100,8 @@ jobs:
with:
github-token: ${{ steps.generate_token.outputs.token }}
script: |
- const {REF, VERSION, BUILD_ID, BUCKET, GRAFANA_COMMIT} = process.env;
-
+ const {REF, VERSION, BUILD_ID, BUCKET, GRAFANA_COMMIT, GITHUB_EVENT_NAME} = process.env;
+
await github.rest.actions.createWorkflowDispatch({
owner: 'grafana',
repo: 'grafana-enterprise',
@@ -108,6 +112,7 @@ jobs:
"build-id": String(BUILD_ID),
"bucket": BUCKET,
"grafana-commit": GRAFANA_COMMIT,
+ "source-event": GITHUB_EVENT_NAME,
}
})
diff --git a/.github/workflows/storybook-a11y.yml b/.github/workflows/storybook-a11y.yml
new file mode 100644
index 00000000000..f666ba37b95
--- /dev/null
+++ b/.github/workflows/storybook-a11y.yml
@@ -0,0 +1,57 @@
+name: Run Storybook a11y tests
+on:
+ pull_request:
+ push:
+ branches:
+ - main
+ - release-*.*.*
+
+permissions: {}
+
+jobs:
+ detect-changes:
+ name: Detect whether code changed
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ outputs:
+ changed: ${{ steps.detect-changes.outputs.frontend }}
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ persist-credentials: true # required to get more history in the changed-files action
+ fetch-depth: 2
+ - name: Detect changes
+ id: detect-changes
+ uses: ./.github/actions/change-detection
+ with:
+ self: .github/workflows/storybook-a11y.yml
+
+ test-storybook-a11y:
+ runs-on: ubuntu-latest-8-cores
+ permissions:
+ contents: read
+ id-token: write
+ needs: detect-changes
+ if: needs.detect-changes.outputs.changed == 'true'
+ name: "Run Storybook a11y tests"
+ steps:
+ - uses: actions/checkout@v4
+ with:
+ persist-credentials: false
+ - uses: actions/setup-node@v4
+ with:
+ node-version-file: '.nvmrc'
+ - run: yarn install --immutable --check-cache
+ - name: Install Playwright browsers
+ run: npx playwright install --with-deps
+ - name: Start Storybook
+ run: yarn storybook &
+ - name: Run tests
+ # the chromium browser used by Playwright sets its locale to "en_US@posix" by default
+ # this is not a valid language code, and causes some stories to fail to load!
+ # instead, we set the LANG environment variable to en_US to override this
+ # see https://github.com/microsoft/playwright/issues/34046
+ env:
+ LANG: en_US
+ run: npx wait-on --timeout 120000 http://localhost:9001 && yarn test:storybook
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 345aedc792a..1a979b3b88e 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,313 @@
+
+
+# 12.1.0 (2025-07-23)
+
+### Features and enhancements
+
+- **Access:** Disable role none option if advanced access control is not enabled [#107378](https://github.com/grafana/grafana/pull/107378), [@Jguer](https://github.com/Jguer)
+- **Alerting:** Add OAuth2 Support for Webhook Receiver [#106302](https://github.com/grafana/grafana/pull/106302), [@JacobsonMT](https://github.com/JacobsonMT)
+- **Alerting:** Add ability to import rules to GMA from Prometheus YAML [#105807](https://github.com/grafana/grafana/pull/105807), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
+- **Alerting:** Add details to the payload when tracking import to GMA [#106404](https://github.com/grafana/grafana/pull/106404), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
+- **Alerting:** Add export folder action to the new list view [#106256](https://github.com/grafana/grafana/pull/106256), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
+- **Alerting:** Add filters for health and contact point in Prometheus Rules api [#106580](https://github.com/grafana/grafana/pull/106580), [@moustafab](https://github.com/moustafab)
+- **Alerting:** Add loading spinner for loading groups state [#106289](https://github.com/grafana/grafana/pull/106289), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
+- **Alerting:** Add need more info for import ui datasource field [#106364](https://github.com/grafana/grafana/pull/106364), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
+- **Alerting:** Add provenance to Prometheus API [#106596](https://github.com/grafana/grafana/pull/106596), [@moustafab](https://github.com/moustafab)
+- **Alerting:** Add provenance to remote-ruler extension response (Enterprise)
+- **Alerting:** Add simplified routing metadata to the details tab [#106403](https://github.com/grafana/grafana/pull/106403), [@gillesdemey](https://github.com/gillesdemey)
+- **Alerting:** Add state history backend to write ALERTS metric [#104361](https://github.com/grafana/grafana/pull/104361), [@alexander-akhmetov](https://github.com/alexander-akhmetov)
+- **Alerting:** Add support for Redis Sentinel for Alerting HA [#106322](https://github.com/grafana/grafana/pull/106322), [@vstpme](https://github.com/vstpme)
+- **Alerting:** Allow disabling recording rules write for a data source in the UI [#106664](https://github.com/grafana/grafana/pull/106664), [@alexander-akhmetov](https://github.com/alexander-akhmetov)
+- **Alerting:** Correctly persist FiredAt in SyncRuleStatePersister [#106658](https://github.com/grafana/grafana/pull/106658), [@fayzal-g](https://github.com/fayzal-g)
+- **Alerting:** Ensure errors cleared when Alerting after error [#105246](https://github.com/grafana/grafana/pull/105246), [@moustafab](https://github.com/moustafab)
+- **Alerting:** Evaluate all imported from Prometheus rules sequentially [#106295](https://github.com/grafana/grafana/pull/106295), [@alexander-akhmetov](https://github.com/alexander-akhmetov)
+- **Alerting:** Extensible Settings module [#107831](https://github.com/grafana/grafana/pull/107831), [@konrad147](https://github.com/konrad147)
+- **Alerting:** Filter out rules managed by integrations and add an info alert [#106602](https://github.com/grafana/grafana/pull/106602), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
+- **Alerting:** Filter out synthetic datasource-managed rules when importing to GMA [#106358](https://github.com/grafana/grafana/pull/106358), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
+- **Alerting:** List V2 - Add labels popup [#107193](https://github.com/grafana/grafana/pull/107193), [@konrad147](https://github.com/konrad147)
+- **Alerting:** List V2 - Grouped view filters [#106400](https://github.com/grafana/grafana/pull/106400), [@konrad147](https://github.com/konrad147)
+- **Alerting:** List V2 - Use backend filters for GMA rules [#106897](https://github.com/grafana/grafana/pull/106897), [@konrad147](https://github.com/konrad147)
+- **Alerting:** Make paginated rules endpoint strongly consistent (Enterprise)
+- **Alerting:** Optimize out unnecessary permission check for rule groups (Enterprise)
+- **Alerting:** Optimize prometheus api permission checks [#106299](https://github.com/grafana/grafana/pull/106299), [@moustafab](https://github.com/moustafab)
+- **Alerting:** Optimize prometheus api permission checks (Enterprise)
+- **Alerting:** Persist alert instance FiredAt field [#105927](https://github.com/grafana/grafana/pull/105927), [@fayzal-g](https://github.com/fayzal-g)
+- **Alerting:** Remove ruler from alert list view2 [#106778](https://github.com/grafana/grafana/pull/106778), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
+- **Alerting:** Resend alerts for states that are missing in the eval results [#105965](https://github.com/grafana/grafana/pull/105965), [@alexander-akhmetov](https://github.com/alexander-akhmetov)
+- **Alerting:** Send notifications immediately on Error|NoData -> Normal transitions [#106421](https://github.com/grafana/grafana/pull/106421), [@alexander-akhmetov](https://github.com/alexander-akhmetov)
+- **Alerting:** Support PDC in Grafana-managed recording rules [#106677](https://github.com/grafana/grafana/pull/106677), [@alexander-akhmetov](https://github.com/alexander-akhmetov)
+- **Alerting:** Use default_datasource_uid as the default target for recording rules in UI [#106415](https://github.com/grafana/grafana/pull/106415), [@alexander-akhmetov](https://github.com/alexander-akhmetov)
+- **Annotations:** Use dashboard uids instead of dashboard ids [#106676](https://github.com/grafana/grafana/pull/106676), [@stephaniehingtgen](https://github.com/stephaniehingtgen)
+- **App Platform Provisioning:** Add experimental nanogit mode for Git Sync [#106763](https://github.com/grafana/grafana/pull/106763), [@MissingRoberto](https://github.com/MissingRoberto)
+- **Auth:** Add Azure/Entra workload identity support [#104807](https://github.com/grafana/grafana/pull/104807), [@mehighlow](https://github.com/mehighlow)
+- **Auth:** Enable improved session handling by default for OAuth and SAML [#107442](https://github.com/grafana/grafana/pull/107442), [@mgyongyosi](https://github.com/mgyongyosi)
+- **Auth:** Enable ssoSettingsLDAP by default [#106310](https://github.com/grafana/grafana/pull/106310), [@mgyongyosi](https://github.com/mgyongyosi)
+- **Auth:** Remove api key endpoints [#106019](https://github.com/grafana/grafana/pull/106019), [@dmihai](https://github.com/dmihai)
+- **Auth:** Remove code for authenticating API keys [#105998](https://github.com/grafana/grafana/pull/105998), [@dmihai](https://github.com/dmihai)
+- **Azure:** Support scope selection in Resource Graph queries [#105835](https://github.com/grafana/grafana/pull/105835), [@aangelisc](https://github.com/aangelisc)
+- **Betterer:** Only allow singleton Storage use [#105310](https://github.com/grafana/grafana/pull/105310), [@tskarhed](https://github.com/tskarhed)
+- **Caching:** Remove memcached reconnect_interval setting (Enterprise)
+- **Chore:** Update k8s.io to v0.33.1 [#105307](https://github.com/grafana/grafana/pull/105307), [@ryantxu](https://github.com/ryantxu)
+- **Cloud Monitoring:** Add support for service account impersonation [#107022](https://github.com/grafana/grafana/pull/107022), [@zoltanbedi](https://github.com/zoltanbedi)
+- **CloudMigrations:** Add Mute Timings as dependency for Notification Policies [#106751](https://github.com/grafana/grafana/pull/106751), [@macabu](https://github.com/macabu)
+- **CloudWatch:** Backport aws-sdk-go-v2 update from external plugin [#107136](https://github.com/grafana/grafana/pull/107136), [@njvrzm](https://github.com/njvrzm)
+- **CloudWatch:** Improve instance attribute variable query editor [#105206](https://github.com/grafana/grafana/pull/105206), [@iwysiu](https://github.com/iwysiu)
+- **Cloudwatch:** Add missing AWS regions [#106304](https://github.com/grafana/grafana/pull/106304), [@chriscerie](https://github.com/chriscerie)
+- **Dashboard Provisioning:** Reduce db load [#106114](https://github.com/grafana/grafana/pull/106114), [@stephaniehingtgen](https://github.com/stephaniehingtgen)
+- **Dashboard:** Add Alert icon in library panels [#107723](https://github.com/grafana/grafana/pull/107723), [@axelavargas](https://github.com/axelavargas)
+- **Dashboard:** Add server-configurable quick ranges for the time picker [#102254](https://github.com/grafana/grafana/pull/102254), [@chodges15](https://github.com/chodges15)
+- **Dashboard:** Formatting Currency - add new custom 'financial' currency format without abbreviations [#106604](https://github.com/grafana/grafana/pull/106604), [@axelavargas](https://github.com/axelavargas)
+- **Dashboard:** Library Panels - Add ability to search by folder name [#106997](https://github.com/grafana/grafana/pull/106997), [@axelavargas](https://github.com/axelavargas)
+- **Dashboard:** Schema V2 - Auto-transform V2 dashboards in V1Resource export mode [#105997](https://github.com/grafana/grafana/pull/105997), [@axelavargas](https://github.com/axelavargas)
+- **Datasources:** Migrate to new sigv4 middleware (Enterprise)
+- **Datasources:** Update grafana-aws-sdk for new sigv4 middleware and aws-sdk-go v1 removal [#107522](https://github.com/grafana/grafana/pull/107522), [@njvrzm](https://github.com/njvrzm)
+- **DatePicker:** Add cursor not-allowed style and hover background color [#106451](https://github.com/grafana/grafana/pull/106451), [@ywzheng1](https://github.com/ywzheng1)
+- **Dependencies:** Bump Go to v1.24.4 [#106533](https://github.com/grafana/grafana/pull/106533), [@macabu](https://github.com/macabu)
+- **Dependencies:** Bump github.com/go-viper/mapstructure/v2 from 2.2.1 to 2.3.0 [#107379](https://github.com/grafana/grafana/pull/107379), [@macabu](https://github.com/macabu)
+- **Dependencies:** Bump github.com/openfga/openfga to v1.8.13 to address CVE-2025-48371 [#106064](https://github.com/grafana/grafana/pull/106064), [@macabu](https://github.com/macabu)
+- **ElasticSearch:** Remove frontend response parsing [#104148](https://github.com/grafana/grafana/pull/104148), [@nojaf](https://github.com/nojaf)
+- **Geomap:** Add HiDPI support to CARTO basemap (#81195) [#106211](https://github.com/grafana/grafana/pull/106211), [@cledwynl](https://github.com/cledwynl)
+- **Git Sync UI:** Delete Provisioned Dashboard Flow [#106593](https://github.com/grafana/grafana/pull/106593), [@ywzheng1](https://github.com/ywzheng1)
+- **Grafana/data:** Extract fuzzy search core [#107110](https://github.com/grafana/grafana/pull/107110), [@Clarity-89](https://github.com/Clarity-89)
+- **I18n:** Update eslint rule to catch some untranslated object properties [#105072](https://github.com/grafana/grafana/pull/105072), [@tomratcliffe](https://github.com/tomratcliffe)
+- **InfluxDB:** Add an optional time range filter for tag queries in the query panel autocompleteInflux tag filter [#107195](https://github.com/grafana/grafana/pull/107195), [@NikolayTsvetkov](https://github.com/NikolayTsvetkov)
+- **LBAC for data sources:** Adds team filtering for lbac rules (Enterprise)
+- **Library Panels:** Mark library panel RBAC as GA & enable by default [#106833](https://github.com/grafana/grafana/pull/106833), [@kaydelaney](https://github.com/kaydelaney)
+- **Library Panels:** Modify connection api endpoint to be compatible with unified storage [#107088](https://github.com/grafana/grafana/pull/107088), [@stephaniehingtgen](https://github.com/stephaniehingtgen)
+- **Library elements:** Remove ability to set as "library variable" [#106594](https://github.com/grafana/grafana/pull/106594), [@stephaniehingtgen](https://github.com/stephaniehingtgen)
+- **Library panels:** Remove `libraryPanelRBAC` feature flag, and enable rbac by default [#107222](https://github.com/grafana/grafana/pull/107222), [@stephaniehingtgen](https://github.com/stephaniehingtgen)
+- **Loki:** Remove experimental lokiQuerySplittingConfig [#107298](https://github.com/grafana/grafana/pull/107298), [@ivanahuckova](https://github.com/ivanahuckova)
+- **Loki:** Remove experimental predefined operations [#107289](https://github.com/grafana/grafana/pull/107289), [@ivanahuckova](https://github.com/ivanahuckova)
+- **OAuth:** Add access token as third source for user info extraction [#107636](https://github.com/grafana/grafana/pull/107636), [@Jguer](https://github.com/Jguer)
+- **Plugin Extensions:** Expose PluginMeta generic in usePluginContext [#107577](https://github.com/grafana/grafana/pull/107577), [@MattIPv4](https://github.com/MattIPv4)
+- **Postgres:** Switch the datasource plugin from lib/pq to pgx [#103961](https://github.com/grafana/grafana/pull/103961), [@zoltanbedi](https://github.com/zoltanbedi)
+- **Preferences:** Use dashboard uid for the home dashboard [#106666](https://github.com/grafana/grafana/pull/106666), [@stephaniehingtgen](https://github.com/stephaniehingtgen)
+- **Profiles:** Stop passing response headers for Grafana-Pyroscope and parca datasources [#106577](https://github.com/grafana/grafana/pull/106577), [@simonswine](https://github.com/simonswine)
+- **Prometheus:** Deprecation message for Azure auth [#106490](https://github.com/grafana/grafana/pull/106490), [@bossinc](https://github.com/bossinc)
+- **Prometheus:** Facilitate tree shaking with exports and bundler mode [#105575](https://github.com/grafana/grafana/pull/105575), [@NWRichmond](https://github.com/NWRichmond)
+- **Prometheus:** Migrate remaining selectors to data-testid [#106564](https://github.com/grafana/grafana/pull/106564), [@idastambuk](https://github.com/idastambuk)
+- **ProvisionedFolder:** Delete folder drawer [#107089](https://github.com/grafana/grafana/pull/107089), [@ywzheng1](https://github.com/ywzheng1)
+- **Provisioning:** Add pure git repository type [#106815](https://github.com/grafana/grafana/pull/106815), [@MissingRoberto](https://github.com/MissingRoberto)
+- **Querying:** Pass dashboard and panel title as headers [#107032](https://github.com/grafana/grafana/pull/107032), [@ivanahuckova](https://github.com/ivanahuckova)
+- **Remote Alertmanager:** Send SMTP config [#106337](https://github.com/grafana/grafana/pull/106337), [@santihernandezc](https://github.com/santihernandezc)
+- **Restore dashboards:** Add filters and search [#106994](https://github.com/grafana/grafana/pull/106994), [@Clarity-89](https://github.com/Clarity-89)
+- **SCIM:** Ignore unsupported fields in user PATCH requests (Enterprise)
+- **SCIM:** Implement operation for adding an externalId value to a team (Enterprise)
+- **SCIM:** Implement the add members operation in group PATCH requests (Enterprise)
+- **SCIM:** Implement the remove members operation in group PATCH requests (Enterprise)
+- **SCIM:** Update externalId field in group PATCH request (Enterprise)
+- **SQL Expressions:** Always convert on type first [#106083](https://github.com/grafana/grafana/pull/106083), [@kylebrandt](https://github.com/kylebrandt)
+- **Select:** Set min width for the current selected item when width=auto [#106131](https://github.com/grafana/grafana/pull/106131), [@tskarhed](https://github.com/tskarhed)
+- **StateTimeline:** Display false and empty string values [#107059](https://github.com/grafana/grafana/pull/107059), [@jesdavpet](https://github.com/jesdavpet)
+- **StateTimeline:** Support `NaN` and `null` value mappings [#105638](https://github.com/grafana/grafana/pull/105638), [@fastfrwrd](https://github.com/fastfrwrd)
+- **Storage:** Take `migration_locking` setting into account [#105938](https://github.com/grafana/grafana/pull/105938), [@JohnnyQQQQ](https://github.com/JohnnyQQQQ)
+- **TableNG:** Refactor to better take advantage of react-data-grid [#103755](https://github.com/grafana/grafana/pull/103755), [@leeoniya](https://github.com/leeoniya)
+- **Tables:** Pills for Table Cells [#107485](https://github.com/grafana/grafana/pull/107485), [@timlevett](https://github.com/timlevett)
+- **Teams:** Add support for updating externalId field [#106406](https://github.com/grafana/grafana/pull/106406), [@dmihai](https://github.com/dmihai)
+- **Tempo:** Enable native histograms for Tempo service graph [#105989](https://github.com/grafana/grafana/pull/105989), [@bohandley](https://github.com/bohandley)
+- **TimeRangePicker:** Highlight range on hover [#106616](https://github.com/grafana/grafana/pull/106616), [@joshhunt](https://github.com/joshhunt)
+- **TraceView:** Resource attributes links extension point [#104680](https://github.com/grafana/grafana/pull/104680), [@edvard-falkskar](https://github.com/edvard-falkskar)
+- **Transformations:** Add "Auto" mode to Organize Fields [#103055](https://github.com/grafana/grafana/pull/103055), [@gelicia](https://github.com/gelicia)
+- **Transformations:** GA the Regression transformation [#106074](https://github.com/grafana/grafana/pull/106074), [@gelicia](https://github.com/gelicia)
+- **Unified storage:** Respect GF_DATABASE_URL override [#105331](https://github.com/grafana/grafana/pull/105331), [@pstibrany](https://github.com/pstibrany)
+- **VQB:** Add selected columns to GROUP BY dropdown (#106349) [#106391](https://github.com/grafana/grafana/pull/106391), [@Shubham19032004](https://github.com/Shubham19032004)
+- **VQB:** Allow custom table names in TableSelector [#106420](https://github.com/grafana/grafana/pull/106420), [@Victorthedev](https://github.com/Victorthedev)
+- **XYChart:** Add support for x=time [#106459](https://github.com/grafana/grafana/pull/106459), [@leeoniya](https://github.com/leeoniya)
+
+### Bug fixes
+
+- **Alerting:** Fix $value type when single data source is queried [#106080](https://github.com/grafana/grafana/pull/106080), [@alexander-akhmetov](https://github.com/alexander-akhmetov)
+- **Alerting:** Fix ImportToGMARules flaky test [#106495](https://github.com/grafana/grafana/pull/106495), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
+- **Alerting:** Fix RefIds not being shown when creating or editing Grafana-managed recording rule [#106840](https://github.com/grafana/grafana/pull/106840), [@soniaAguilarPeiron](https://github.com/soniaAguilarPeiron)
+- **Alerting:** Fix contact points tab visibility when user can only create [#106735](https://github.com/grafana/grafana/pull/106735), [@JacobsonMT](https://github.com/JacobsonMT)
+- **Alerting:** Fix eval time unit in list view [#106488](https://github.com/grafana/grafana/pull/106488), [@ebuildy](https://github.com/ebuildy)
+- **Alerting:** Fix group interval override when adding new rules [#107324](https://github.com/grafana/grafana/pull/107324), [@konrad147](https://github.com/konrad147)
+- **Alerting:** Fix group-level labels and query_offset in the import API [#106379](https://github.com/grafana/grafana/pull/106379), [@alexander-akhmetov](https://github.com/alexander-akhmetov)
+- **Alerting:** Fix notification policy conflicts originating from provenance mismatch [#107343](https://github.com/grafana/grafana/pull/107343), [@moustafab](https://github.com/moustafab)
+- **Alerting:** Fix resolved notifications for same-label Error to Normal transitions [#106210](https://github.com/grafana/grafana/pull/106210), [@alexander-akhmetov](https://github.com/alexander-akhmetov)
+- **Alerting:** Hide labels section if we only have private labels [#105996](https://github.com/grafana/grafana/pull/105996), [@gillesdemey](https://github.com/gillesdemey)
+- **Annotations:** Remove prometheus from legacy runner [#106737](https://github.com/grafana/grafana/pull/106737), [@scottlepp](https://github.com/scottlepp)
+- **Azure:** Fix Application Insights metadata requests [#105614](https://github.com/grafana/grafana/pull/105614), [@aangelisc](https://github.com/aangelisc)
+- **Azure:** Fix duplicated trace links [#105698](https://github.com/grafana/grafana/pull/105698), [@aangelisc](https://github.com/aangelisc)
+- **Azure:** Fix legend formatting [#106504](https://github.com/grafana/grafana/pull/106504), [@aangelisc](https://github.com/aangelisc)
+- **Azure:** Fix resource name determination in template variable queries [#105705](https://github.com/grafana/grafana/pull/105705), [@aangelisc](https://github.com/aangelisc)
+- **BarChart/StateTimeline:** Use noValue setting for error message when data is empty [#107147](https://github.com/grafana/grafana/pull/107147), [@fastfrwrd](https://github.com/fastfrwrd)
+- **CloudWatch:** Fix http client handling + assume role bug [#107893](https://github.com/grafana/grafana/pull/107893), [@njvrzm](https://github.com/njvrzm)
+- **CloudWatch:** Fix proxy transport issue [#107807](https://github.com/grafana/grafana/pull/107807), [@njvrzm](https://github.com/njvrzm)
+- **Dashboard:** FF `dashboardNewLayouts` Fix library panels non-editable when multiple added [#107052](https://github.com/grafana/grafana/pull/107052), [@axelavargas](https://github.com/axelavargas)
+- **Dashboard:** Fix cache validation to prevent stale cache [#105918](https://github.com/grafana/grafana/pull/105918), [@yashschandra](https://github.com/yashschandra)
+- **Dashboard:** Fixes issue with dashboard links that include all variables [#106356](https://github.com/grafana/grafana/pull/106356), [@torkelo](https://github.com/torkelo)
+- **Dashboards:** Fix history list for dashboard uids that end in `-` [#107073](https://github.com/grafana/grafana/pull/107073), [@stephaniehingtgen](https://github.com/stephaniehingtgen)
+- **Drilldown:** Fix js crash when using http [#105646](https://github.com/grafana/grafana/pull/105646), [@chu121su12](https://github.com/chu121su12)
+- **Fix:** Increase login_attempt.ip_address column length for IPv6 support [#107035](https://github.com/grafana/grafana/pull/107035), [@Jguer](https://github.com/Jguer)
+- **FlameGraph:** Fix bug for function names that conflict with JavaScript object prototype properties [#106338](https://github.com/grafana/grafana/pull/106338), [@simonswine](https://github.com/simonswine)
+- **Folders:** Correctly resolve nested folder breadcrumbs [#106344](https://github.com/grafana/grafana/pull/106344), [@IevaVasiljeva](https://github.com/IevaVasiljeva)
+- **GrafanaUI:** Fix Combobox ignoring loading prop [#105584](https://github.com/grafana/grafana/pull/105584), [@ValeraS](https://github.com/ValeraS)
+- **Graphite:** Fix annotation queries [#106553](https://github.com/grafana/grafana/pull/106553), [@aangelisc](https://github.com/aangelisc)
+- **Graphite:** Fix date mutation [#107414](https://github.com/grafana/grafana/pull/107414), [@aangelisc](https://github.com/aangelisc)
+- **Graphite:** Fix nested variable interpolation for repeated rows [#106976](https://github.com/grafana/grafana/pull/106976), [@aangelisc](https://github.com/aangelisc)
+- **K8s:** Dashboards /apis: Fix library element connections [#106734](https://github.com/grafana/grafana/pull/106734), [@stephaniehingtgen](https://github.com/stephaniehingtgen)
+- **Loki:** Fix health check message [#107170](https://github.com/grafana/grafana/pull/107170), [@wooffie](https://github.com/wooffie)
+- **Loki:** Fix issue where step parameter using a template variable was marked as invalid [#106541](https://github.com/grafana/grafana/pull/106541), [@ivanahuckova](https://github.com/ivanahuckova)
+- **Loki:** Fix label browser not sorted after selection of a label [#107394](https://github.com/grafana/grafana/pull/107394), [@paulojmdias](https://github.com/paulojmdias)
+- **Org:** Fix org deletion [#106193](https://github.com/grafana/grafana/pull/106193), [@stephaniehingtgen](https://github.com/stephaniehingtgen)
+- **Plugins:** Fix and encode invalid gRPC header values [#107339](https://github.com/grafana/grafana/pull/107339), [@ivanahuckova](https://github.com/ivanahuckova)
+- **PostgreSQL:** Fix error on panel when toggling sqlDatasourceDatabaseSelection feature [#106965](https://github.com/grafana/grafana/pull/106965), [@HasithDeAlwis](https://github.com/HasithDeAlwis)
+- **Profiles:** Fix for passing the response headers [#106293](https://github.com/grafana/grafana/pull/106293), [@simonswine](https://github.com/simonswine)
+- **Reporting:** Stop sending reports with Never schedule on creation (Enterprise)
+- **SCIM:** Fix PUT request for deactivating a user (Enterprise)
+- **SCIM:** Fix the removal of all members in group PUT requests (Enterprise)
+- **SCIM:** Fix user patch operation (Enterprise)
+- **Security:** Add fix for CVE-2025-3580 [#105976](https://github.com/grafana/grafana/pull/105976), [@baldm0mma](https://github.com/baldm0mma)
+- **Security:** Fixes for CVE-2025-6197 and CVE-2025-6023 [#108333](https://github.com/grafana/grafana/pull/108333), [@mgyongyosi](https://github.com/mgyongyosi)
+- **Settings:** Fix reencryption and rollback of encrypted values in setting table (Enterprise)
+- **Tempo:** Fix showing dangling edges in NodeGraph [#107245](https://github.com/grafana/grafana/pull/107245), [@ifrost](https://github.com/ifrost)
+- **ToolTip:** Fix flexbox bug with tooltip when `maxWidth` is set manually [#107145](https://github.com/grafana/grafana/pull/107145), [@jdmarshall](https://github.com/jdmarshall)
+- **URLParams:** Stringify true values as key=true always (fixes issues with variables with true value) [#106440](https://github.com/grafana/grafana/pull/106440), [@torkelo](https://github.com/torkelo)
+
+### Breaking changes
+
+- **Alerting:** Enable recording rules by default [#105603](https://github.com/grafana/grafana/pull/105603), [@alexander-akhmetov](https://github.com/alexander-akhmetov)
+
+### Plugin development fixes & changes
+
+- **Carousel:** Always center image [#106468](https://github.com/grafana/grafana/pull/106468), [@ashharrison90](https://github.com/ashharrison90)
+- **Drawer:** Include divider and close button when passing a custom title element [#106896](https://github.com/grafana/grafana/pull/106896), [@ashharrison90](https://github.com/ashharrison90)
+
+
+
+
+# 12.0.3 (2025-07-23)
+
+### Bug fixes
+
+- **Security:** Fixes for CVE-2025-6197 and CVE-2025-6023 [#108280](https://github.com/grafana/grafana/pull/108280), [@volcanonoodle](https://github.com/volcanonoodle)
+
+
+
+
+# 11.6.4 (2025-07-23)
+
+### Features and enhancements
+
+- **Dependencies:** Bump github.com/go-viper/mapstructure/v2 from 2.2.1 to 2.3.0 [#107555](https://github.com/grafana/grafana/pull/107555), [@macabu](https://github.com/macabu)
+- **StateTimeline:** Add endTime to tooltip [#107605](https://github.com/grafana/grafana/pull/107605), [@adela-almasan](https://github.com/adela-almasan)
+- **Unified storage:** Respect GF_DATABASE_URL override [#107573](https://github.com/grafana/grafana/pull/107573), [@pstibrany](https://github.com/pstibrany)
+
+### Bug fixes
+
+- **Alerting:** Fix group interval override when adding new rules [#107496](https://github.com/grafana/grafana/pull/107496), [@konrad147](https://github.com/konrad147)
+- **Azure:** Fix legend formatting [#106934](https://github.com/grafana/grafana/pull/106934), [@aangelisc](https://github.com/aangelisc)
+- **Azure:** Fix resource name determination in template variable queries [#106939](https://github.com/grafana/grafana/pull/106939), [@aangelisc](https://github.com/aangelisc)
+- **Graphite:** Fix annotation queries [#106940](https://github.com/grafana/grafana/pull/106940), [@aangelisc](https://github.com/aangelisc)
+- **Graphite:** Fix date mutation [#107523](https://github.com/grafana/grafana/pull/107523), [@aangelisc](https://github.com/aangelisc)
+- **Graphite:** Fix nested variable interpolation for repeated rows [#107564](https://github.com/grafana/grafana/pull/107564), [@aangelisc](https://github.com/aangelisc)
+- **Security:** Fixes for CVE-2025-6197 and CVE-2025-6023 [#108281](https://github.com/grafana/grafana/pull/108281), [@volcanonoodle](https://github.com/volcanonoodle)
+
+
+
+
+# 11.5.7 (2025-07-23)
+
+### Features and enhancements
+
+- **Dependencies:** Bump github.com/go-viper/mapstructure/v2 from 2.2.1 to 2.3.0 [#107556](https://github.com/grafana/grafana/pull/107556), [@macabu](https://github.com/macabu)
+
+### Bug fixes
+
+- **Azure:** Fix legend formatting [#106933](https://github.com/grafana/grafana/pull/106933), [@aangelisc](https://github.com/aangelisc)
+- **Azure:** Fix resource name determination in template variable queries [#106938](https://github.com/grafana/grafana/pull/106938), [@aangelisc](https://github.com/aangelisc)
+- **Security:** Fixes for CVE-2025-6197 and CVE-2025-6023 [#108280](https://github.com/grafana/grafana/pull/108280), [@volcanonoodle](https://github.com/volcanonoodle)
+
+
+
+
+# 11.4.7 (2025-07-23)
+
+### Features and enhancements
+
+- **Dependencies:** Bump github.com/go-viper/mapstructure/v2 from 2.2.1 to 2.3.0 [#107557](https://github.com/grafana/grafana/pull/107557), [@macabu](https://github.com/macabu)
+
+### Bug fixes
+
+- **Azure:** Fix legend formatting [#106932](https://github.com/grafana/grafana/pull/106932), [@aangelisc](https://github.com/aangelisc)
+- **Security:** Fixes for CVE-2025-6197 and CVE-2025-6023 [#108279](https://github.com/grafana/grafana/pull/108279), [@volcanonoodle](https://github.com/volcanonoodle)
+
+
+
+
+# 11.3.9 (2025-07-23)
+
+### Features and enhancements
+
+- **Dependencies:** Bump github.com/go-viper/mapstructure/v2 from 2.2.1 to 2.3.0 [#107558](https://github.com/grafana/grafana/pull/107558), [@macabu](https://github.com/macabu)
+
+### Bug fixes
+
+- **Azure:** Fix legend formatting [#106931](https://github.com/grafana/grafana/pull/106931), [@aangelisc](https://github.com/aangelisc)
+- **Security:** Fixes for CVE-2025-6197 and CVE-2025-6023 [#108278](https://github.com/grafana/grafana/pull/108278), [@volcanonoodle](https://github.com/volcanonoodle)
+
+
+
+
+# 12.0.2+security-01 (2025-07-17)
+
+### Features and enhancements
+
+- **Profiles:** Stop passing response headers for Grafana-Pyroscope and parca datasources [#106730](https://github.com/grafana/grafana/pull/106730), [@simonswine](https://github.com/simonswine)
+
+### Bug fixes
+
+- **FlameGraph:** Fix bug for function names that conflict with JavaScript object prototype properties [#106625](https://github.com/grafana/grafana/pull/106625), [@simonswine](https://github.com/simonswine)
+- **Security:** Fixed CVE-2025-6023
+- **Security:** Fixed CVE-2025-6197
+
+
+
+
+# 11.6.3+security-01 (2025-07-17)
+
+### Features and enhancements
+
+- **Profiles:** Stop passing response headers for Grafana-Pyroscope and parca datasources [#106729](https://github.com/grafana/grafana/pull/106729), [@simonswine](https://github.com/simonswine)
+
+### Bug fixes
+
+- **FlameGraph:** Fix bug for function names that conflict with JavaScript object prototype properties [#106624](https://github.com/grafana/grafana/pull/106624), [@simonswine](https://github.com/simonswine)
+- **Security:** Fixed CVE-2025-6023
+- **Security:** Fixed CVE-2025-6197
+
+
+
+
+# 11.5.6+security-01 (2025-07-17)
+
+### Bug fixes
+
+- **Security:** Fixed CVE-2025-6023
+- **Security:** Fixed CVE-2025-6197
+
+
+
+
+# 11.4.6+security-01 (2025-07-17)
+
+### Bug fixes
+
+- **Security:** Fixed CVE-2025-6023
+- **Security:** Fixed CVE-2025-6197
+
+
+
+
+# 11.3.8+security-01 (2025-07-17)
+
+### Bug fixes
+
+- **Security:** Fixed CVE-2025-6023
+- **Security:** Fixed CVE-2025-6197
+
+
# 12.0.2 (2025-06-17)
diff --git a/Dockerfile b/Dockerfile
index 07874fff677..ddc832d65c9 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -16,7 +16,7 @@ ARG JS_SRC=js-builder
# By using FROM instructions we can delegate dependency updates to dependabot
FROM alpine:3.21.3 AS alpine-base
FROM ubuntu:22.04 AS ubuntu-base
-FROM golang:1.24.4-alpine AS go-builder-base
+FROM golang:1.24.5-alpine AS go-builder-base
FROM --platform=${JS_PLATFORM} node:22-alpine AS js-builder-base
# Javascript build stage
diff --git a/GOVERNANCE.md b/GOVERNANCE.md
index ff129a87557..f246ca03386 100644
--- a/GOVERNANCE.md
+++ b/GOVERNANCE.md
@@ -7,7 +7,6 @@ This document describes the rules and governance of the project. It is meant to
- **Maintainers**: Maintainers lead an individual project or parts thereof ([`MAINTAINERS.md`][maintainers]).
- **Projects**: A single repository in the Grafana GitHub organization and listed below is referred to as a project:
-
- clock-panel
- devtools
- gel-app
diff --git a/Makefile b/Makefile
index e2778594804..1d058780a48 100644
--- a/Makefile
+++ b/Makefile
@@ -9,7 +9,7 @@ include .bingo/Variables.mk
include .citools/Variables.mk
GO = go
-GO_VERSION = 1.24.4
+GO_VERSION = 1.24.5
GO_LINT_FILES ?= $(shell ./scripts/go-workspace/golangci-lint-includes.sh)
GO_TEST_FILES ?= $(shell ./scripts/go-workspace/test-includes.sh)
SH_FILES ?= $(shell find ./scripts -name *.sh)
@@ -168,7 +168,7 @@ gen-cuev2: ## Do all CUE code generation
# TODO (@radiohead): uncomment once we want to start generating code for all apps.
# For now, we want to use an explicit list of apps to generate code for.
#
-# APPS_DIRS=$(shell find ./apps -mindepth 1 -maxdepth 1 -type d | sort)
+#APPS_DIRS=$(shell find ./apps -type d -exec test -f "{}/Makefile" \; -print | sort)
APPS_DIRS := ./apps/dashboard ./apps/folder ./apps/alerting/notifications
.PHONY: gen-apps
@@ -263,8 +263,8 @@ build-plugin-go: ## Build decoupled plugins
build: build-go build-js ## Build backend and frontend.
.PHONY: run
-run: ## Build and run web server on filesystem changes. See /.bra.toml for configuration.
- $(bra) run
+run: ## Build and run backend, and watch for changes. See .air.toml for configuration.
+ $(air) -c .air.toml
.PHONY: run-go
run-go: ## Build and run web server immediately.
@@ -275,9 +275,9 @@ run-go: ## Build and run web server immediately.
run-frontend: deps-js ## Fetch js dependencies and watch frontend for rebuild
yarn start
-.PHONY: run-air
-run-air: ## [Experimental] Build and run backend, and watch for changes. See .air.toml for configuration. Check https://github.com/air-verse/air for installation instructions.
- air -c .air.toml
+.PHONY: run-bra
+run-air: ## [Deprecated] Build and run web server on filesystem changes. See /.bra.toml for configuration.
+ $(bra) run
.PHONY: frontend-service-check
frontend-service-check:
diff --git a/apps/advisor/Makefile b/apps/advisor/Makefile
index b8b335bfa68..aaac06377ca 100644
--- a/apps/advisor/Makefile
+++ b/apps/advisor/Makefile
@@ -1,22 +1,5 @@
-APP_SDK_VERSION := v0.39.2
-APP_SDK_DIR := $(shell go env GOPATH)/bin/app-sdk-$(APP_SDK_VERSION)
-APP_SDK_BIN := $(APP_SDK_DIR)/grafana-app-sdk
-
-.PHONY: install-app-sdk
-install-app-sdk: $(APP_SDK_BIN) ## Install the Grafana App SDK
-
-$(APP_SDK_BIN):
- @echo "Installing Grafana App SDK version $(APP_SDK_VERSION)"
- @mkdir -p $(APP_SDK_DIR)
- # The only way to install specific versions of binaries using `go install`
- # is by setting GOBIN to the directory you want to install the binary to.
- GOBIN=$(APP_SDK_DIR) go install github.com/grafana/grafana-app-sdk/cmd/grafana-app-sdk@$(APP_SDK_VERSION)
- @touch $@
-
-.PHONY: update-app-sdk
-update-app-sdk: ## Update the Grafana App SDK dependency in go.mod
- go get github.com/grafana/grafana-app-sdk@$(APP_SDK_VERSION)
+include ../sdk.mk
.PHONY: generate
-generate: ## Run Grafana App SDK code generation
- @$(APP_SDK_BIN) generate -g ./pkg/apis --grouping=group --postprocess --defencoding=none
+generate: install-app-sdk update-app-sdk
+ @$(APP_SDK_BIN) generate -g ./pkg/apis --grouping=group --postprocess --defencoding=none --useoldmanifestkinds
diff --git a/apps/advisor/README.md b/apps/advisor/README.md
index 27c44711f43..c7929d9db62 100644
--- a/apps/advisor/README.md
+++ b/apps/advisor/README.md
@@ -142,7 +142,6 @@ Check [`security_config_step.go`](./pkg/app/checks/configchecks/security_config_
2. **Type Safety**: Use type assertions to ensure you're working with the correct type of item.
3. **Severity Levels**: Use appropriate severity levels:
-
- `CheckReportFailureSeverityHigh`: For critical issues that need immediate attention
- `CheckReportFailureSeverityLow`: For non-critical issues that can be addressed later
diff --git a/apps/advisor/go.mod b/apps/advisor/go.mod
index 65832aabb4b..853c9850196 100644
--- a/apps/advisor/go.mod
+++ b/apps/advisor/go.mod
@@ -1,89 +1,286 @@
module github.com/grafana/grafana/apps/advisor
-go 1.24.4
+go 1.24.5
require (
- github.com/grafana/grafana-app-sdk v0.39.2
- k8s.io/apimachinery v0.33.2
- k8s.io/klog/v2 v2.130.1
+ github.com/Masterminds/semver/v3 v3.4.0
+ github.com/google/go-github/v70 v70.0.0
+ github.com/grafana/authlib/types v0.0.0-20250710201142-9542f2f28d43
+ github.com/grafana/grafana v0.0.0-00010101000000-000000000000
+ github.com/grafana/grafana-app-sdk v0.40.0
+ github.com/grafana/grafana-app-sdk/logging v0.39.3
+ github.com/grafana/grafana-plugin-sdk-go v0.278.0
+ github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250725144121-b1592b5e36d2
+ github.com/stretchr/testify v1.10.0
+ k8s.io/apimachinery v0.33.3
+ k8s.io/apiserver v0.33.3
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff
)
+// transitive dependencies that need replaced
+// TODO: stop depending on grafana core
+replace github.com/grafana/grafana => ../..
+
+replace github.com/prometheus/alertmanager => github.com/grafana/prometheus-alertmanager v0.25.1-0.20250620093340-be61a673dee6
+
require (
+ cloud.google.com/go/compute/metadata v0.7.0 // indirect
+ dario.cat/mergo v1.0.1 // indirect
+ filippo.io/edwards25519 v1.1.0 // indirect
+ github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 // indirect
+ github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0 // indirect
+ github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect
+ github.com/Azure/go-ntlmssp v0.0.0-20220621081337-cb9428e4ac1e // indirect
+ github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect
+ github.com/BurntSushi/toml v1.5.0 // indirect
+ github.com/Masterminds/goutils v1.1.1 // indirect
+ github.com/Masterminds/semver v1.5.0 // indirect
+ github.com/Masterminds/sprig/v3 v3.3.0 // indirect
+ github.com/ProtonMail/go-crypto v1.1.6 // indirect
+ github.com/VividCortex/mysqlerr v0.0.0-20170204212430-6c6b55f8796f // indirect
+ github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect
+ github.com/apache/arrow-go/v18 v18.3.0 // indirect
+ github.com/armon/go-metrics v0.4.1 // indirect
+ github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
+ github.com/at-wat/mqtt-go v0.19.4 // indirect
+ github.com/aws/aws-sdk-go v1.55.7 // indirect
+ github.com/aws/aws-sdk-go-v2 v1.36.5 // indirect
+ github.com/aws/aws-sdk-go-v2/credentials v1.17.70 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17 // indirect
+ github.com/aws/aws-sdk-go-v2/service/sts v1.34.0 // indirect
+ github.com/aws/smithy-go v1.22.4 // indirect
+ github.com/benbjohnson/clock v1.3.5 // indirect
github.com/beorn7/perks v1.0.1 // indirect
+ github.com/blang/semver/v4 v4.0.0 // indirect
+ github.com/bluele/gcache v0.0.2 // indirect
github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 // indirect
+ github.com/bwmarrin/snowflake v0.3.0 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
+ github.com/cenkalti/backoff/v5 v5.0.2 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
+ github.com/cheekybits/genny v1.0.0 // indirect
+ github.com/chromedp/cdproto v0.0.0-20250429231605-6ed5b53462d4 // indirect
+ github.com/cloudflare/circl v1.6.1 // indirect
+ github.com/coreos/go-systemd/v22 v22.5.0 // indirect
+ github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
- github.com/emicklei/go-restful/v3 v3.11.0 // indirect
+ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
+ github.com/dlmiddlecote/sqlstats v1.0.2 // indirect
+ github.com/docker/go-units v0.5.0 // indirect
+ github.com/dolthub/flatbuffers/v23 v23.3.3-dh.2 // indirect
+ github.com/dolthub/go-icu-regex v0.0.0-20250327004329-6799764f2dad // indirect
+ github.com/dolthub/go-mysql-server v0.19.1-0.20250410182021-5632d67cd46e // indirect
+ github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71 // indirect
+ github.com/dolthub/vitess v0.0.0-20250410090211-143e6b272ad4 // indirect
+ github.com/elazarl/goproxy v1.7.2 // indirect
+ github.com/emicklei/go-restful/v3 v3.12.1 // indirect
github.com/evanphx/json-patch v5.6.0+incompatible // indirect
+ github.com/fatih/color v1.18.0 // indirect
+ github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
+ github.com/gchaincl/sqlhooks v1.3.0 // indirect
github.com/getkin/kin-openapi v0.132.0 // indirect
- github.com/go-logr/logr v1.4.2 // indirect
+ github.com/go-asn1-ber/asn1-ber v1.5.4 // indirect
+ github.com/go-jose/go-jose/v3 v3.0.4 // indirect
+ github.com/go-kit/log v0.2.1 // indirect
+ github.com/go-ldap/ldap/v3 v3.4.4 // indirect
+ github.com/go-logfmt/logfmt v0.6.0 // indirect
+ github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
+ github.com/go-openapi/analysis v0.23.0 // indirect
+ github.com/go-openapi/errors v0.22.0 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
+ github.com/go-openapi/loads v0.22.0 // indirect
+ github.com/go-openapi/runtime v0.28.0 // indirect
+ github.com/go-openapi/spec v0.21.0 // indirect
+ github.com/go-openapi/strfmt v0.23.0 // indirect
github.com/go-openapi/swag v0.23.0 // indirect
- github.com/go-viper/mapstructure/v2 v2.3.0 // indirect
+ github.com/go-openapi/validate v0.24.0 // indirect
+ github.com/go-redis/redis/v8 v8.11.5 // indirect
+ github.com/go-sql-driver/mysql v1.9.2 // indirect
+ github.com/go-stack/stack v1.8.1 // indirect
+ github.com/gobwas/glob v0.2.3 // indirect
+ github.com/goccy/go-json v0.10.5 // indirect
+ github.com/gofrs/uuid v4.4.0+incompatible // indirect
+ github.com/gogo/googleapis v1.4.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
+ github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
+ github.com/golang-jwt/jwt/v5 v5.2.2 // indirect
+ github.com/golang-migrate/migrate/v4 v4.7.0 // indirect
+ github.com/golang/mock v1.7.0-rc.1 // indirect
github.com/golang/protobuf v1.5.4 // indirect
+ github.com/google/btree v1.1.3 // indirect
+ github.com/google/flatbuffers v25.2.10+incompatible // indirect
github.com/google/gnostic-models v0.6.9 // indirect
github.com/google/go-cmp v0.7.0 // indirect
- github.com/google/gofuzz v1.2.0 // indirect
- github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect
+ github.com/google/go-querystring v1.1.0 // indirect
github.com/google/uuid v1.6.0 // indirect
- github.com/grafana/authlib v0.0.0-20250515162837-2f4a8263eabb // indirect
- github.com/grafana/grafana-app-sdk/logging v0.39.1 // indirect
- github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect
+ github.com/google/wire v0.6.0 // indirect
+ github.com/gorilla/mux v1.8.1 // indirect
+ github.com/grafana/alerting v0.0.0-20250725130805-615c8286e14b // indirect
+ github.com/grafana/authlib v0.0.0-20250710201142-9542f2f28d43 // indirect
+ github.com/grafana/dataplane/sdata v0.0.9 // indirect
+ github.com/grafana/dskit v0.0.0-20250611075409-46f51e1ce914 // indirect
+ github.com/grafana/grafana-aws-sdk v1.0.4 // indirect
+ github.com/grafana/grafana-azure-sdk-go/v2 v2.1.6 // indirect
+ github.com/grafana/grafana/pkg/apiserver v0.0.0-20250627191313-2f1a6ae1712b // indirect
+ github.com/grafana/otel-profiling-go v0.5.1 // indirect
+ github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect
+ github.com/grafana/sqlds/v4 v4.2.3 // indirect
+ github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0 // indirect
+ github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 // indirect
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
+ github.com/hashicorp/go-hclog v1.6.3 // indirect
+ github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
+ github.com/hashicorp/go-metrics v0.5.4 // indirect
+ github.com/hashicorp/go-msgpack/v2 v2.1.2 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
- github.com/invopop/yaml v0.3.1 // indirect
+ github.com/hashicorp/go-plugin v1.6.3 // indirect
+ github.com/hashicorp/go-sockaddr v1.0.7 // indirect
+ github.com/hashicorp/golang-lru v1.0.2 // indirect
+ github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
+ github.com/hashicorp/memberlist v0.5.2 // indirect
+ github.com/hashicorp/yamux v0.1.1 // indirect
+ github.com/huandu/xstrings v1.5.0 // indirect
+ github.com/jaegertracing/jaeger-idl v0.5.0 // indirect
+ github.com/jessevdk/go-flags v1.5.0 // indirect
+ github.com/jmespath-community/go-jmespath v1.1.1 // indirect
+ github.com/jmespath/go-jmespath v0.4.0 // indirect
+ github.com/jmoiron/sqlx v1.3.5 // indirect
github.com/josharian/intern v1.0.0 // indirect
+ github.com/jpillora/backoff v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
+ github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 // indirect
github.com/klauspost/compress v1.18.0 // indirect
- github.com/mailru/easyjson v0.7.7 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.10 // indirect
+ github.com/kylelemons/godebug v1.1.0 // indirect
+ github.com/lestrrat-go/strftime v1.0.4 // indirect
+ github.com/lib/pq v1.10.9 // indirect
+ github.com/magefile/mage v1.15.0 // indirect
+ github.com/mailru/easyjson v0.9.0 // indirect
+ github.com/mattetti/filebuffer v1.0.1 // indirect
+ github.com/mattn/go-colorable v0.1.14 // indirect
+ github.com/mattn/go-isatty v0.0.20 // indirect
+ github.com/mattn/go-runewidth v0.0.16 // indirect
+ github.com/mattn/go-sqlite3 v1.14.22 // indirect
+ github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
+ github.com/mdlayher/socket v0.4.1 // indirect
+ github.com/mdlayher/vsock v1.2.1 // indirect
+ github.com/miekg/dns v1.1.63 // indirect
+ github.com/mitchellh/copystructure v1.2.0 // indirect
+ github.com/mitchellh/go-homedir v1.1.0 // indirect
+ github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c // indirect
+ github.com/mitchellh/reflectwalk v1.0.2 // indirect
+ github.com/mithrandie/csvq v1.18.1 // indirect
+ github.com/mithrandie/csvq-driver v1.7.0 // indirect
+ github.com/mithrandie/go-file/v2 v2.1.0 // indirect
+ github.com/mithrandie/go-text v1.6.0 // indirect
+ github.com/mithrandie/ternary v1.1.1 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
- github.com/openfga/openfga v1.8.13 // indirect
+ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect
+ github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect
+ github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect
+ github.com/oklog/run v1.1.0 // indirect
+ github.com/oklog/ulid v1.3.1 // indirect
+ github.com/olekukonko/tablewriter v0.0.5 // indirect
+ github.com/open-feature/go-sdk v1.14.1 // indirect
+ github.com/open-feature/go-sdk-contrib/providers/go-feature-flag v0.2.3 // indirect
+ github.com/open-feature/go-sdk-contrib/providers/ofrep v0.1.5 // indirect
+ github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
github.com/perimeterx/marshmallow v1.1.5 // indirect
+ github.com/pierrec/lz4/v4 v4.1.22 // indirect
+ github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect
+ github.com/pkg/errors v0.9.1 // indirect
+ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
+ github.com/prometheus/alertmanager v0.28.0 // indirect
github.com/prometheus/client_golang v1.22.0 // indirect
- github.com/prometheus/client_model v0.6.1 // indirect
- github.com/prometheus/common v0.63.0 // indirect
+ github.com/prometheus/client_model v0.6.2 // indirect
+ github.com/prometheus/common v0.65.0 // indirect
+ github.com/prometheus/common/sigv4 v0.1.0 // indirect
+ github.com/prometheus/exporter-toolkit v0.14.0 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/puzpuzpuz/xsync/v2 v2.5.1 // indirect
+ github.com/rivo/uniseg v0.4.7 // indirect
+ github.com/rs/cors v1.11.1 // indirect
+ github.com/russross/blackfriday/v2 v2.1.0 // indirect
+ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect
+ github.com/shopspring/decimal v1.4.0 // 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/spf13/cast v1.7.1 // indirect
github.com/spf13/pflag v1.0.6 // indirect
+ github.com/stretchr/objx v0.5.2 // indirect
+ github.com/tetratelabs/wazero v1.8.2 // indirect
+ github.com/tjhop/slog-gokit v0.1.3 // indirect
+ github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8 // indirect
+ github.com/unknwon/com v1.0.1 // indirect
+ github.com/unknwon/log v0.0.0-20200308114134-929b1006e34a // indirect
+ github.com/urfave/cli v1.22.16 // indirect
github.com/x448/float16 v0.8.4 // indirect
+ github.com/zeebo/xxh3 v1.0.2 // indirect
+ go.mongodb.org/mongo-driver v1.16.1 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
- go.opentelemetry.io/otel v1.36.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.36.0 // indirect
- go.opentelemetry.io/otel/metric v1.36.0 // indirect
- go.opentelemetry.io/otel/sdk v1.36.0 // indirect
- go.opentelemetry.io/otel/trace v1.36.0 // indirect
- go.opentelemetry.io/proto/otlp v1.6.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.61.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect
+ go.opentelemetry.io/contrib/propagators/jaeger v1.36.0 // indirect
+ go.opentelemetry.io/contrib/samplers/jaegerremote v0.30.0 // indirect
+ go.opentelemetry.io/otel v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0 // indirect
+ go.opentelemetry.io/otel/metric v1.37.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.37.0 // indirect
+ go.opentelemetry.io/otel/trace v1.37.0 // indirect
+ go.opentelemetry.io/proto/otlp v1.7.0 // indirect
+ go.uber.org/atomic v1.11.0 // indirect
+ go.yaml.in/yaml/v2 v2.4.2 // indirect
golang.org/x/crypto v0.39.0 // indirect
+ golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
+ golang.org/x/mod v0.25.0 // indirect
golang.org/x/net v0.41.0 // indirect
- golang.org/x/oauth2 v0.29.0 // indirect
- golang.org/x/sync v0.15.0 // indirect
+ golang.org/x/oauth2 v0.30.0 // indirect
+ golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.33.0 // indirect
golang.org/x/term v0.32.0 // indirect
golang.org/x/text v0.26.0 // indirect
- golang.org/x/time v0.9.0 // indirect
+ golang.org/x/time v0.11.0 // indirect
+ golang.org/x/tools v0.34.0 // indirect
+ golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 // indirect
+ gonum.org/v1/gonum v0.16.0 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
google.golang.org/grpc v1.73.0 // indirect
google.golang.org/protobuf v1.36.6 // indirect
+ gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
+ gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
+ gopkg.in/ini.v1 v1.67.0 // indirect
+ gopkg.in/mail.v2 v2.3.1 // indirect
+ gopkg.in/src-d/go-errors.v1 v1.0.0 // indirect
+ gopkg.in/telebot.v3 v3.2.1 // indirect
+ gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
- k8s.io/api v0.33.2 // indirect
+ k8s.io/api v0.33.3 // indirect
k8s.io/apiextensions-apiserver v0.33.2 // indirect
- k8s.io/client-go v0.33.2 // indirect
- k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
- sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
+ k8s.io/client-go v0.33.3 // indirect
+ k8s.io/component-base v0.33.3 // indirect
+ k8s.io/klog/v2 v2.130.1 // indirect
+ k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect
+ sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
+ sigs.k8s.io/randfill v1.0.0 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect
- sigs.k8s.io/yaml v1.4.0 // indirect
+ sigs.k8s.io/yaml v1.5.0 // indirect
+ xorm.io/builder v0.3.6 // indirect
)
diff --git a/apps/advisor/go.sum b/apps/advisor/go.sum
index 90b34992392..2613bb8c90c 100644
--- a/apps/advisor/go.sum
+++ b/apps/advisor/go.sum
@@ -1,341 +1,1918 @@
+cel.dev/expr v0.23.1 h1:K4KOtPCJQjVggkARsjG9RWXP6O4R73aHeJMa/dmCQQg=
+cel.dev/expr v0.23.1/go.mod h1:hLPLo1W4QUmuYdA72RBX06QTs6MXw941piREPl3Yfiw=
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+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.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=
+cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
+cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
+cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
+cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
+cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
+cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
+cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
+cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
+cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
+cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
+cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
+cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
+cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=
+cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
+cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
+cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
+cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=
+cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=
+cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
+cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
+cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
+cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
+cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
+cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
+cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A=
+cloud.google.com/go v0.121.1 h1:S3kTQSydxmu1JfLRLpKtxRPA7rSrYPRPEUmL/PavVUw=
+cloud.google.com/go v0.121.1/go.mod h1:nRFlrHq39MNVWu+zESP2PosMWA0ryJw8KUBZ2iZpxbw=
+cloud.google.com/go/auth v0.16.1 h1:XrXauHMd30LhQYVRHLGvJiYeczweKQXZxsTbV9TiguU=
+cloud.google.com/go/auth v0.16.1/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI=
+cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=
+cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=
+cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
+cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
+cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
+cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
+cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
+cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
+cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow=
+cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM=
+cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M=
+cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s=
+cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=
+cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU=
+cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo=
+cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
+cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
+cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY=
+cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8=
+cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE=
+cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM=
+cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U=
+cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
+cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
+cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
+cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
+cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
+cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
+cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
+cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
+cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
+cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
+cloud.google.com/go/storage v1.55.0 h1:NESjdAToN9u1tmhVqhXCaCwYBuvEhZLLv0gBr+2znf0=
+cloud.google.com/go/storage v1.55.0/go.mod h1:ztSmTTwzsdXe5syLVS0YsbFxXuvEmEyZj7v7zChEmuY=
+cuelang.org/go v0.11.1 h1:pV+49MX1mmvDm8Qh3Za3M786cty8VKPWzQ1Ho4gZRP0=
+cuelang.org/go v0.11.1/go.mod h1:PBY6XvPUswPPJ2inpvUozP9mebDVTXaeehQikhZPBz0=
+dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
+dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
+dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
+filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
+filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
+github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0 h1:OVoM452qUFBrX+URdH3VpR299ma4kfom0yB0URYky9g=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0/go.mod h1:kUjrAo8bgEwLeZ/CmHqNl3Z/kPm7y6FKfxxK0izYUg4=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8=
+github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4=
+github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA=
+github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.1 h1:lhZdRq7TIx0GJQvSyX2Si406vrYsov2FXGp/RnSEtcs=
+github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.1/go.mod h1:8cl44BDmi+effbARHMQjgOKA2AYvcohNm7KEt42mSV8=
+github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
+github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
+github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
+github.com/Azure/go-autorest/autorest v0.11.29 h1:I4+HL/JDvErx2LjyzaVxllw2lRDB5/BT2Bm4g20iqYw=
+github.com/Azure/go-autorest/autorest/to v0.4.1 h1:CxNHBqdzTr7rLtdrtb5CMjJcDut+WNGCVv7OmS5+lTc=
+github.com/Azure/go-autorest/autorest/to v0.4.1/go.mod h1:EtaofgU4zmtvn1zT2ARsjRFdq9vXx0YWtmElwL+GZ9M=
+github.com/Azure/go-ntlmssp v0.0.0-20220621081337-cb9428e4ac1e h1:NeAW1fUYUEWhft7pkxDf6WoUvEZJ/uOKsvtpjLnn8MU=
+github.com/Azure/go-ntlmssp v0.0.0-20220621081337-cb9428e4ac1e/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
+github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM=
+github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE=
+github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs=
+github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
+github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
+github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
+github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
+github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 h1:6/0iUd0xrnX7qt+mLNRwg5c0PGv8wpE8K90ryANQwMI=
+github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0=
+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.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
+github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
+github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
+github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
+github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs=
+github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0=
+github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
+github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I=
+github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c=
+github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=
+github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw=
+github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
+github.com/RoaringBitmap/roaring v1.9.3 h1:t4EbC5qQwnisr5PrP9nt0IRhRTb9gMUgQF4t4S2OByM=
+github.com/RoaringBitmap/roaring v1.9.3/go.mod h1:6AXUsoIEzDTFFQCe1RbGA6uFONMhvejWj5rqITANK90=
+github.com/RoaringBitmap/roaring/v2 v2.4.5 h1:uGrrMreGjvAtTBobc0g5IrW1D5ldxDQYe2JW2gggRdg=
+github.com/RoaringBitmap/roaring/v2 v2.4.5/go.mod h1:FiJcsfkGje/nZBZgCu0ZxCPOKD/hVXDS2dXi7/eUFE0=
+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/mysqlerr v0.0.0-20170204212430-6c6b55f8796f h1:HR5nRmUQgXrwqZOwZ2DAc/aCi3Bu3xENpspW935vxu0=
+github.com/VividCortex/mysqlerr v0.0.0-20170204212430-6c6b55f8796f/go.mod h1:f3HiCrHjHBdcm6E83vGaXh1KomZMA2P6aeo3hKx/wg0=
+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=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0=
+github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs=
+github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
+github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
+github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
+github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ=
+github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw=
+github.com/apache/arrow-go/v18 v18.3.0 h1:Xq4A6dZj9Nu33sqZibzn012LNnewkTUlfKVUFD/RX/I=
+github.com/apache/arrow-go/v18 v18.3.0/go.mod h1:eEM1DnUTHhgGAjf/ChvOAQbUQ+EPohtDrArffvUjPg8=
+github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE=
+github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw=
+github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
+github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
+github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc=
+github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=
+github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=
+github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI=
+github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
+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/at-wat/mqtt-go v0.19.4 h1:R2cbCU7O5PHQ38unbe1Y51ncG3KsFEJV6QeipDoqdLQ=
+github.com/at-wat/mqtt-go v0.19.4/go.mod h1:AsiWc9kqVOhqq7LzUeWT/AkKUBfx3Sw5cEe8lc06fqA=
+github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
+github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro=
+github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE=
+github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
+github.com/aws/aws-sdk-go-v2 v1.36.5 h1:0OF9RiEMEdDdZEMqF9MRjevyxAQcf6gY+E7vwBILFj0=
+github.com/aws/aws-sdk-go-v2 v1.36.5/go.mod h1:EYrzvCCN9CMUTa5+6lf6MM4tq3Zjp8UhSGR/cBsjai0=
+github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11 h1:12SpdwU8Djs+YGklkinSSlcrPyj3H4VifVsKf78KbwA=
+github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.11/go.mod h1:dd+Lkp6YmMryke+qxW/VnKyhMBDTYP41Q2Bb+6gNZgY=
+github.com/aws/aws-sdk-go-v2/config v1.29.17 h1:jSuiQ5jEe4SAMH6lLRMY9OVC+TqJLP5655pBGjmnjr0=
+github.com/aws/aws-sdk-go-v2/config v1.29.17/go.mod h1:9P4wwACpbeXs9Pm9w1QTh6BwWwJjwYvJ1iCt5QbCXh8=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.70 h1:ONnH5CM16RTXRkS8Z1qg7/s2eDOhHhaXVd72mmyv4/0=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.70/go.mod h1:M+lWhhmomVGgtuPOhO85u4pEa3SmssPTdcYpP/5J/xc=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32 h1:KAXP9JSHO1vKGCr5f4O6WmlVKLFFXgWYAGoJosorxzU=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.32/go.mod h1:h4Sg6FQdexC1yYG9RDnOvLbW1a/P986++/Y/a+GyEM8=
+github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.69 h1:6VFPH/Zi9xYFMJKPQOX5URYkQoXRWeJ7V/7Y6ZDYoms=
+github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.69/go.mod h1:GJj8mmO6YT6EqgduWocwhMoxTLFitkhIrK+owzrYL2I=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36 h1:SsytQyTMHMDPspp+spo7XwXTP44aJZZAC7fBV2C5+5s=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36/go.mod h1:Q1lnJArKRXkenyog6+Y+zr7WDpk4e6XlR6gs20bbeNo=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36 h1:i2vNHQiXUvKhs3quBR6aqlgJaiaexz/aNvdCktW/kAM=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36/go.mod h1:UdyGa7Q91id/sdyHPwth+043HhmP6yP9MBHgbZM0xo8=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3 h1:bIqFDwgGXXN1Kpp99pDOdKMTTb5d2KyU5X/BZxjOkRo=
+github.com/aws/aws-sdk-go-v2/internal/ini v1.8.3/go.mod h1:H5O/EsxDWyU+LP/V8i5sm8cxoZgc2fdNR9bxlOFrQTo=
+github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34 h1:ZNTqv4nIdE/DiBfUUfXcLZ/Spcuz+RjeziUtNJackkM=
+github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.34/go.mod h1:zf7Vcd1ViW7cPqYWEHLHJkS50X0JS2IKz9Cgaj6ugrs=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 h1:CXV68E2dNqhuynZJPB80bhPQwAKqBWVer887figW6Jc=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4/go.mod h1:/xFi9KtvBXP97ppCz1TAEvU1Uf66qvid89rbem3wCzQ=
+github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.0 h1:lguz0bmOoGzozP9XfRJR1QIayEYo+2vP/No3OfLF0pU=
+github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.7.0/go.mod h1:iu6FSzgt+M2/x3Dk8zhycdIcHjEFb36IS8HVUVFoMg0=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17 h1:t0E6FzREdtCsiLIoLCWsYliNsRBgyGD/MCK571qk4MI=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17/go.mod h1:ygpklyoaypuyDvOM5ujWGrYWpAK3h7ugnmKCU/76Ys4=
+github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15 h1:moLQUoVq91LiqT1nbvzDukyqAlCv89ZmwaHw/ZFlFZg=
+github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.18.15/go.mod h1:ZH34PJUc8ApjBIfgQCFvkWcUDBtl/WTD+uiYHjd8igA=
+github.com/aws/aws-sdk-go-v2/service/s3 v1.78.2 h1:jIiopHEV22b4yQP2q36Y0OmwLbsxNWdWwfZRR5QRRO4=
+github.com/aws/aws-sdk-go-v2/service/s3 v1.78.2/go.mod h1:U5SNqwhXB3Xe6F47kXvWihPl/ilGaEDe8HD/50Z9wxc=
+github.com/aws/aws-sdk-go-v2/service/sso v1.25.5 h1:AIRJ3lfb2w/1/8wOOSqYb9fUKGwQbtysJ2H1MofRUPg=
+github.com/aws/aws-sdk-go-v2/service/sso v1.25.5/go.mod h1:b7SiVprpU+iGazDUqvRSLf5XmCdn+JtT1on7uNL6Ipc=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3 h1:BpOxT3yhLwSJ77qIY3DoHAQjZsc4HEGfMCE4NGy3uFg=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.3/go.mod h1:vq/GQR1gOFLquZMSrxUK/cpvKCNVYibNyJ1m7JrU88E=
+github.com/aws/aws-sdk-go-v2/service/sts v1.34.0 h1:NFOJ/NXEGV4Rq//71Hs1jC/NvPs1ezajK+yQmkwnPV0=
+github.com/aws/aws-sdk-go-v2/service/sts v1.34.0/go.mod h1:7ph2tGpfQvwzgistp2+zga9f+bCjlQJPkPUmMgDSD7w=
+github.com/aws/smithy-go v1.22.4 h1:uqXzVZNuNexwc/xrh6Tb56u89WDlJY6HS+KC0S4QSjw=
+github.com/aws/smithy-go v1.22.4/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI=
+github.com/axiomhq/hyperloglog v0.0.0-20240507144631-af9851f82b27 h1:60m4tnanN1ctzIu4V3bfCNJ39BiOPSm1gHFlFjTkRE0=
+github.com/axiomhq/hyperloglog v0.0.0-20240507144631-af9851f82b27/go.mod h1:k08r+Yj1PRAmuayFiRK6MYuR5Ve4IuZtTfxErMIh0+c=
+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/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
+github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
+github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k=
+github.com/bits-and-blooms/bitset v1.22.0 h1:Tquv9S8+SGaS3EhyA+up3FXzmkhxPGjQQCkcs2uw7w4=
+github.com/bits-and-blooms/bitset v1.22.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8=
+github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
+github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
+github.com/blevesearch/bleve/v2 v2.5.0 h1:HzYqBy/5/M9Ul9ESEmXzN/3Jl7YpmWBdHM/+zzv/3k4=
+github.com/blevesearch/bleve/v2 v2.5.0/go.mod h1:PcJzTPnEynO15dCf9isxOga7YFRa/cMSsbnRwnszXUk=
+github.com/blevesearch/bleve_index_api v1.2.7 h1:c8r9vmbaYQroAMSGag7zq5gEVPiuXrUQDqfnj7uYZSY=
+github.com/blevesearch/bleve_index_api v1.2.7/go.mod h1:rKQDl4u51uwafZxFrPD1R7xFOwKnzZW7s/LSeK4lgo0=
+github.com/blevesearch/geo v0.1.20 h1:paaSpu2Ewh/tn5DKn/FB5SzvH0EWupxHEIwbCk/QPqM=
+github.com/blevesearch/geo v0.1.20/go.mod h1:DVG2QjwHNMFmjo+ZgzrIq2sfCh6rIHzy9d9d0B59I6w=
+github.com/blevesearch/go-faiss v1.0.25 h1:lel1rkOUGbT1CJ0YgzKwC7k+XH0XVBHnCVWahdCXk4U=
+github.com/blevesearch/go-faiss v1.0.25/go.mod h1:OMGQwOaRRYxrmeNdMrXJPvVx8gBnvE5RYrr0BahNnkk=
+github.com/blevesearch/go-porterstemmer v1.0.3 h1:GtmsqID0aZdCSNiY8SkuPJ12pD4jI+DdXTAn4YRcHCo=
+github.com/blevesearch/go-porterstemmer v1.0.3/go.mod h1:angGc5Ht+k2xhJdZi511LtmxuEf0OVpvUUNrwmM1P7M=
+github.com/blevesearch/gtreap v0.1.1 h1:2JWigFrzDMR+42WGIN/V2p0cUvn4UP3C4Q5nmaZGW8Y=
+github.com/blevesearch/gtreap v0.1.1/go.mod h1:QaQyDRAT51sotthUWAH4Sj08awFSSWzgYICSZ3w0tYk=
+github.com/blevesearch/mmap-go v1.0.4 h1:OVhDhT5B/M1HNPpYPBKIEJaD0F3Si+CrEKULGCDPWmc=
+github.com/blevesearch/mmap-go v1.0.4/go.mod h1:EWmEAOmdAS9z/pi/+Toxu99DnsbhG1TIxUoRmJw/pSs=
+github.com/blevesearch/scorch_segment_api/v2 v2.3.9 h1:X6nJXnNHl7nasXW+U6y2Ns2Aw8F9STszkYkyBfQ+p0o=
+github.com/blevesearch/scorch_segment_api/v2 v2.3.9/go.mod h1:IrzspZlVjhf4X29oJiEhBxEteTqOY9RlYlk1lCmYHr4=
+github.com/blevesearch/segment v0.9.1 h1:+dThDy+Lvgj5JMxhmOVlgFfkUtZV2kw49xax4+jTfSU=
+github.com/blevesearch/segment v0.9.1/go.mod h1:zN21iLm7+GnBHWTao9I+Au/7MBiL8pPFtJBJTsk6kQw=
+github.com/blevesearch/snowballstem v0.9.0 h1:lMQ189YspGP6sXvZQ4WZ+MLawfV8wOmPoD/iWeNXm8s=
+github.com/blevesearch/snowballstem v0.9.0/go.mod h1:PivSj3JMc8WuaFkTSRDW2SlrulNWPl4ABg1tC/hlgLs=
+github.com/blevesearch/upsidedown_store_api v1.0.2 h1:U53Q6YoWEARVLd1OYNc9kvhBMGZzVrdmaozG2MfoB+A=
+github.com/blevesearch/upsidedown_store_api v1.0.2/go.mod h1:M01mh3Gpfy56Ps/UXHjEO/knbqyQ1Oamg8If49gRwrQ=
+github.com/blevesearch/vellum v1.1.0 h1:CinkGyIsgVlYf8Y2LUQHvdelgXr6PYuvoDIajq6yR9w=
+github.com/blevesearch/vellum v1.1.0/go.mod h1:QgwWryE8ThtNPxtgWJof5ndPfx0/YMBh+W2weHKPw8Y=
+github.com/blevesearch/zapx/v11 v11.4.1 h1:qFCPlFbsEdwbbckJkysptSQOsHn4s6ZOHL5GMAIAVHA=
+github.com/blevesearch/zapx/v11 v11.4.1/go.mod h1:qNOGxIqdPC1MXauJCD9HBG487PxviTUUbmChFOAosGs=
+github.com/blevesearch/zapx/v12 v12.4.1 h1:K77bhypII60a4v8mwvav7r4IxWA8qxhNjgF9xGdb9eQ=
+github.com/blevesearch/zapx/v12 v12.4.1/go.mod h1:QRPrlPOzAxBNMI0MkgdD+xsTqx65zbuPr3Ko4Re49II=
+github.com/blevesearch/zapx/v13 v13.4.1 h1:EnkEMZFUK0lsW/jOJJF2xOcp+W8TjEsyeN5BeAZEYYE=
+github.com/blevesearch/zapx/v13 v13.4.1/go.mod h1:e6duBMlCvgbH9rkzNMnUa9hRI9F7ri2BRcHfphcmGn8=
+github.com/blevesearch/zapx/v14 v14.4.1 h1:G47kGCshknBZzZAtjcnIAMn3oNx8XBLxp8DMq18ogyE=
+github.com/blevesearch/zapx/v14 v14.4.1/go.mod h1:O7sDxiaL2r2PnCXbhh1Bvm7b4sP+jp4unE9DDPWGoms=
+github.com/blevesearch/zapx/v15 v15.4.1 h1:B5IoTMUCEzFdc9FSQbhVOxAY+BO17c05866fNruiI7g=
+github.com/blevesearch/zapx/v15 v15.4.1/go.mod h1:b/MreHjYeQoLjyY2+UaM0hGZZUajEbE0xhnr1A2/Q6Y=
+github.com/blevesearch/zapx/v16 v16.2.2 h1:MifKJVRTEhMTgSlle2bDRTb39BGc9jXFRLPZc6r0Rzk=
+github.com/blevesearch/zapx/v16 v16.2.2/go.mod h1:B9Pk4G1CqtErgQV9DyCSA9Lb7WZe4olYfGw7fVDZ4sk=
+github.com/bluele/gcache v0.0.2 h1:WcbfdXICg7G/DGBh1PFfcirkWOQV+v077yF1pSy3DGw=
+github.com/bluele/gcache v0.0.2/go.mod h1:m15KV+ECjptwSPxKhOhQoAFQVtUFjTVkc3H8o0t/fp0=
+github.com/blugelabs/bluge v0.2.2 h1:gat8CqE6P6tOgeX30XGLOVNTC26cpM2RWVcreXWtYcM=
+github.com/blugelabs/bluge v0.2.2/go.mod h1:am1LU9jS8dZgWkRzkGLQN3757EgMs3upWrU2fdN9foE=
+github.com/blugelabs/bluge_segment_api v0.2.0 h1:cCX1Y2y8v0LZ7+EEJ6gH7dW6TtVTW4RhG0vp3R+N2Lo=
+github.com/blugelabs/bluge_segment_api v0.2.0/go.mod h1:95XA+ZXfRj/IXADm7gZ+iTcWOJPg5jQTY1EReIzl3LA=
+github.com/blugelabs/ice v1.0.0 h1:um7wf9e6jbkTVCrOyQq3tKK43fBMOvLUYxbj3Qtc4eo=
+github.com/blugelabs/ice v1.0.0/go.mod h1:gNfFPk5zM+yxJROhthxhVQYjpBO9amuxWXJQ2Lo+IbQ=
+github.com/blugelabs/ice/v2 v2.0.1 h1:mzHbntLjk2v7eDRgoXCgzOsPKN1Tenu9Svo6l9cTLS4=
+github.com/blugelabs/ice/v2 v2.0.1/go.mod h1:QxAWSPNwZwsIqS25c3lbIPFQrVvT1sphf5x5DfMLH5M=
+github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 h1:N7oVaKyGp8bttX0bfZGmcGkjz7DLQXhAn3DNd3T0ous=
github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874/go.mod h1:r5xuitiExdLAJ09PR7vBVENGvp4ZuTBeWTGtxuX3K+c=
+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/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
+github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
+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/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
+github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8=
+github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE=
+github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ=
+github.com/chromedp/cdproto v0.0.0-20250429231605-6ed5b53462d4 h1:UZdrvid2JFwnvPlUSEFlE794XZL4Jmrj8fuxfcLECJE=
+github.com/chromedp/cdproto v0.0.0-20250429231605-6ed5b53462d4/go.mod h1:NItd7aLkcfOA/dcMXvl8p1u+lQqioRMq/SqDp71Pb/k=
+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/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/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
+github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
+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=
+github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
+github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
+github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
+github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f h1:C5bqEmzEPLsHm9Mv73lSE9e9bKV23aB1vxOsmZrkl3k=
+github.com/cncf/xds/go v0.0.0-20250326154945-ae57f3c0d45f/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
+github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
+github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
+github.com/cockroachdb/apd/v3 v3.2.1 h1:U+8j7t0axsIgvQUqthuNm82HIrYXodOV2iWLWtEaIwg=
+github.com/cockroachdb/apd/v3 v3.2.1/go.mod h1:klXJcjp+FffLTHlhIG69tezTDvdP065naDsHzKhYSqc=
+github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk=
+github.com/containerd/containerd v1.2.7/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
+github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4=
+github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec=
+github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
+github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
+github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0=
+github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
+github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
+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=
+github.com/cznic/internal v0.0.0-20180608152220-f44710a21d00/go.mod h1:olo7eAdKwJdXxb55TKGLiJ6xt1H0/tiiRCWKVLmtjY4=
+github.com/cznic/lldb v1.1.0/go.mod h1:FIZVUmYUVhPwRiPzL8nD/mpFcJ/G7SSXjjXYG4uRI3A=
+github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM=
+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/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/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
-github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM=
+github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE=
+github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA=
+github.com/dgraph-io/badger/v4 v4.7.0 h1:Q+J8HApYAY7UMpL8d9owqiB+odzEc0zn/aqOD9jhc6Y=
+github.com/dgraph-io/badger/v4 v4.7.0/go.mod h1:He7TzG3YBy3j4f5baj5B7Zl2XyfNe5bl4Udl0aPemVA=
+github.com/dgraph-io/ristretto/v2 v2.2.0 h1:bkY3XzJcXoMuELV8F+vS8kzNgicwQFAaGINAEJdWGOM=
+github.com/dgraph-io/ristretto/v2 v2.2.0/go.mod h1:RZrm63UmcBAaYWC1DotLYBmTvgkrs0+XhBd7Npn7/zI=
+github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc h1:8WFBn63wegobsYAX0YjD+8suexZDga5CctH4CCTx2+8=
+github.com/dgryski/go-metro v0.0.0-20180109044635-280f6062b5bc/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/dhui/dktest v0.3.0/go.mod h1:cyzIUfGsBEbZ6BT7tnXqAShHSXCZhSNmFl70sZ7c1yc=
+github.com/dlmiddlecote/sqlstats v1.0.2 h1:gSU11YN23D/iY50A2zVYwgXgy072khatTsIW6UPjUtI=
+github.com/dlmiddlecote/sqlstats v1.0.2/go.mod h1:0CWaIh/Th+z2aI6Q9Jpfg/o21zmGxWhbByHgQSCUQvY=
+github.com/docker/distribution v2.7.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
+github.com/docker/docker v0.7.3-0.20190103212154-2b7e084dc98b/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/docker v0.7.3-0.20190817195342-4760db040282/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
+github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
+github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
+github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
+github.com/dolthub/flatbuffers/v23 v23.3.3-dh.2 h1:u3PMzfF8RkKd3lB9pZ2bfn0qEG+1Gms9599cr0REMww=
+github.com/dolthub/flatbuffers/v23 v23.3.3-dh.2/go.mod h1:mIEZOHnFx4ZMQeawhw9rhsj+0zwQj7adVsnBX7t+eKY=
+github.com/dolthub/go-icu-regex v0.0.0-20250327004329-6799764f2dad h1:66ZPawHszNu37VPQckdhX1BPPVzREsGgNxQeefnlm3g=
+github.com/dolthub/go-icu-regex v0.0.0-20250327004329-6799764f2dad/go.mod h1:ylU4XjUpsMcvl/BKeRRMXSH7e7WBrPXdSLvnRJYrxEA=
+github.com/dolthub/go-mysql-server v0.19.1-0.20250410182021-5632d67cd46e h1:7pAttAqWaudUAsM9iHASi/4eFBK+qn4qeaNto7g8bK4=
+github.com/dolthub/go-mysql-server v0.19.1-0.20250410182021-5632d67cd46e/go.mod h1:KZyoO3jngyZCLyCf100FEQTrwAHj33AIMj4Zv4u3MNE=
+github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71 h1:bMGS25NWAGTEtT5tOBsCuCrlYnLRKpbJVJkDbrTRhwQ=
+github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71/go.mod h1:2/2zjLQ/JOOSbbSboojeg+cAwcRV0fDLzIiWch/lhqI=
+github.com/dolthub/vitess v0.0.0-20250410090211-143e6b272ad4 h1:LGTt2LtYX8vaai32d+c9L0sMcP+Dg9w1kO6+lbsxxYg=
+github.com/dolthub/vitess v0.0.0-20250410090211-143e6b272ad4/go.mod h1:1gQZs/byeHLMSul3Lvl3MzioMtOW1je79QYGyi2fd70=
+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/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
+github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o=
+github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE=
+github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU=
+github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+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=
+github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
+github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
+github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
+github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
+github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M=
+github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A=
+github.com/envoyproxy/go-control-plane/envoy v1.32.4/go.mod h1:Gzjc5k8JcJswLjAx1Zm+wSYE20UrLtt7JZMWiWQXQEw=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8=
+github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU=
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/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=
+github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
+github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
+github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
+github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
+github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
+github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
+github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
+github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
+github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
+github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
+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/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
-github.com/getkin/kin-openapi v0.128.0 h1:jqq3D9vC9pPq1dGcOCv7yOp1DaEe7c/T1vzcLbITSp4=
-github.com/getkin/kin-openapi v0.128.0/go.mod h1:OZrfXzUfGrNbsKj+xmFBx6E5c6yH3At/tAKSc2UszXM=
-github.com/getkin/kin-openapi v0.131.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58=
+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.132.0 h1:3ISeLMsQzcb5v26yeJrBcdTCEQTag36ZjaGk7MIRUwk=
github.com/getkin/kin-openapi v0.132.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+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-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=
+github.com/go-jose/go-jose/v3 v3.0.4 h1:Wp5HA7bLQcKnf6YYao/4kpRpVMp/yf6+pJKV8WFSaNY=
+github.com/go-jose/go-jose/v3 v3.0.4/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ=
+github.com/go-jose/go-jose/v4 v4.1.0 h1:cYSYxd3pw5zd2FSXk2vGdn9igQU2PS8MuxrCOCl0FdY=
+github.com/go-jose/go-jose/v4 v4.1.0/go.mod h1:GG/vqmYm3Von2nYiB2vGTXzdoNKE5tix5tuc6iAd+sw=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
+github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
+github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
+github.com/go-ldap/ldap/v3 v3.4.4 h1:qPjipEpt+qDa6SI/h1fzuGWoRUY+qqQ9sOZq67/PYUs=
+github.com/go-ldap/ldap/v3 v3.4.4/go.mod h1:fe1MsuN5eJJ1FeLT/LEBVdWfNWKh459R7aXgXtJC+aI=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
+github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
-github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
+github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU=
+github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo=
+github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w=
+github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE=
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
+github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco=
+github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs=
+github.com/go-openapi/runtime v0.28.0 h1:gpPPmWSNGo214l6n8hzdXYhPuJcGtziTOgUpvsFWGIQ=
+github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc=
+github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY=
+github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
+github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c=
+github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4=
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
+github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58=
+github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ=
+github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
+github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA=
+github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
+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-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-sql-driver/mysql v1.9.2 h1:4cNKDYQ1I84SXslGddlsrMhc8k4LeDVj6Ad6WRjiHuU=
+github.com/go-sql-driver/mysql v1.9.2/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw=
+github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM=
github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
-github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk=
-github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
+github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:9wScpmSP5A3Bk8V3XHWUcJmYTh+ZnlHVyc+A4oZYS3Y=
+github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM=
+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/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
+github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
+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 v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA=
+github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
+github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0=
+github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+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.1 h1:DuHXlSFHNKqTQ+/ACf5Vs6r4X/dH2EgIzR9Vr+H65kg=
+github.com/gogo/status v1.1.1/go.mod h1:jpG3dM5QPcqu19Hg8lkUhBFBa3TcLs1DG7+2Jqci7oU=
+github.com/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
+github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
+github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8=
+github.com/golang-jwt/jwt/v5 v5.2.2/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/geo v0.0.0-20210211234256-740aa86cb551 h1:gtexQ/VGyN+VVFRXSFiguSNcXmS6rkKT+X7FdIrTtfo=
+github.com/golang/geo v0.0.0-20210211234256-740aa86cb551/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+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=
+github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 h1:f+oWsMOmNPc8JmEHVZIycC7hBoQxHH9pNKQORJNozsQ=
+github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8/go.mod h1:wcDNUvekVysuuOpQKo3191zZyTpiI6se1N1ULghS0sw=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
+github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
+github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
+github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8=
+github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
+github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U=
+github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs=
+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=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
+github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM=
+github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
-github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
-github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
+github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=
+github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+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.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
+github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
+github.com/google/cel-go v0.25.0 h1:jsFw9Fhn+3y2kBbltZR4VEz5xKkcIFRPDnuEzAGv5GY=
+github.com/google/cel-go v0.25.0/go.mod h1:hjEb6r5SuOSlhCHmFoLzu8HGCERvIsDAbxDAyNU/MmI=
+github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q=
+github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
+github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw=
github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
+github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
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/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
+github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
+github.com/google/go-github/v70 v70.0.0 h1:/tqCp5KPrcvqCc7vIvYyFYTiCGrYvaWoYMGHSQbo55o=
+github.com/google/go-github/v70 v70.0.0/go.mod h1:xBUZgo8MI3lUL/hwxl3hlceJW1U8MVnXP3zUyI+rhQY=
+github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
+github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8=
+github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
-github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg=
-github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
+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=
+github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
+github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
+github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
+github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8=
+github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/s2a-go v0.1.9 h1:LGD7gtMgezd8a/Xak7mEWL0PjoTQFvpRudN895yqKW0=
+github.com/google/s2a-go v0.1.9/go.mod h1:YA0Ei2ZQL3acow2O62kdp9UlnvMmU7kA6Eutn0dXayM=
+github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk=
+github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/grafana/authlib v0.0.0-20250515162837-2f4a8263eabb h1:oTl2j6/4miQUYmXANp2pBuYCWA5f8NVYFfCWpczpFso=
-github.com/grafana/authlib v0.0.0-20250515162837-2f4a8263eabb/go.mod h1:PBtQaXwkFu4BAt2aXsR7w8p8NVpdjV5aJYhqRDei9Us=
-github.com/grafana/grafana-app-sdk v0.30.0 h1:Hqn2pETu2mQ4RpWkZYEQfu01P7xd1Z1Gj+HX/8aB0tw=
-github.com/grafana/grafana-app-sdk v0.30.0/go.mod h1:jhfqNIovb+Mes2vdMf9iMCWQkp1GTNtyNuExONtiNuk=
-github.com/grafana/grafana-app-sdk v0.31.0/go.mod h1:Xw00NL7qpRLo5r3Gn48Bl1Xn2n4eUDI5pYf/wMufKWs=
-github.com/grafana/grafana-app-sdk v0.35.1/go.mod h1:Zx5MkVppYK+ElSDUAR6+fjzOVo6I/cIgk+ty+LmNOxI=
-github.com/grafana/grafana-app-sdk v0.39.0/go.mod h1:xRyBQOttgWTc3tGe9pI0upnpEPVhzALf7Mh/61O4zyY=
-github.com/grafana/grafana-app-sdk v0.39.2 h1:ymfr+1318t+JC9U2OYrzVpGmNG/aJONUmFFu/G98Xh8=
-github.com/grafana/grafana-app-sdk v0.39.2/go.mod h1:t0m6q561lpoHQCixS9LUHFUhUzDClzNtm7BH60gHVSY=
-github.com/grafana/grafana-app-sdk/logging v0.29.0 h1:mgbXaAf33aFwqwGVeaX30l8rkeAJH0iACgX5Rn6YkN4=
-github.com/grafana/grafana-app-sdk/logging v0.29.0/go.mod h1:xy6ZyVXl50Z3DBDLybvBPphbykPhuVNed/VNmen9DQM=
-github.com/grafana/grafana-app-sdk/logging v0.30.0/go.mod h1:xy6ZyVXl50Z3DBDLybvBPphbykPhuVNed/VNmen9DQM=
-github.com/grafana/grafana-app-sdk/logging v0.35.0/go.mod h1:Y/bvbDhBiV/tkIle9RW49pgfSPIPSON8Q4qjx3pyqDk=
-github.com/grafana/grafana-app-sdk/logging v0.38.2/go.mod h1:Y/bvbDhBiV/tkIle9RW49pgfSPIPSON8Q4qjx3pyqDk=
-github.com/grafana/grafana-app-sdk/logging v0.39.1/go.mod h1:WhDENSnaGHtyVVwZGVnAR7YLvh2xlLDYR3D7E6h7XVk=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 h1:VNqngBF40hVlDloBruUehVYC3ArSgIyScOAyMRqBxRg=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1/go.mod h1:RBRO7fro65R6tjKzYgLAFo0t1QEXY1Dp+i/bvpRiqiQ=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI=
+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/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4=
+github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA=
+github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
+github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0=
+github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM=
+github.com/googleapis/gax-go/v2 v2.2.0/go.mod h1:as02EH8zWkzwUoLbBaFeQ+arQaj/OthfcblKl4IGNaM=
+github.com/googleapis/gax-go/v2 v2.3.0/go.mod h1:b8LNqSzNabLiUpXKkY7HAR5jr6bIT99EXz9pXxye9YM=
+github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c=
+github.com/googleapis/gax-go/v2 v2.14.2 h1:eBLnkZ9635krYIPD+ag1USrOAI0Nr0QYF3+/3GqO0k0=
+github.com/googleapis/gax-go/v2 v2.14.2/go.mod h1:ON64QhlJkhVtSqp4v1uaK92VyZ2gmvDQsweuyLV+8+w=
+github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
+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.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
+github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
+github.com/grafana/alerting v0.0.0-20250725130805-615c8286e14b h1:mfUAq/N+mS82EcE35hDXWtfVY7UhTjzZxzssvFt9tvQ=
+github.com/grafana/alerting v0.0.0-20250725130805-615c8286e14b/go.mod h1:VKxaR93Gff0ZlO2sPcdPVob1a/UzArFEW5zx3Bpyhls=
+github.com/grafana/authlib v0.0.0-20250710201142-9542f2f28d43 h1:vVPT0i5Y1vI6qzecYStV2yk7cHKrC3Pc7AgvwT5KydQ=
+github.com/grafana/authlib v0.0.0-20250710201142-9542f2f28d43/go.mod h1:1fWkOiL+m32NBgRHZtlZGz2ji868tPZACYbqP3nBRJI=
+github.com/grafana/authlib/types v0.0.0-20250710201142-9542f2f28d43 h1:NlkGMnVi/oUn6Cr90QbJYpQJ4FnjyAIG9Ex5GtTZIzw=
+github.com/grafana/authlib/types v0.0.0-20250710201142-9542f2f28d43/go.mod h1:qeWYbnWzaYGl88JlL9+DsP1GT2Cudm58rLtx13fKZdw=
+github.com/grafana/dataplane/examples v0.0.1 h1:K9M5glueWyLoL4//H+EtTQq16lXuHLmOhb6DjSCahzA=
+github.com/grafana/dataplane/examples v0.0.1/go.mod h1:h5YwY8s407/17XF5/dS8XrUtsTVV2RnuW8+m1Mp46mg=
+github.com/grafana/dataplane/sdata v0.0.9 h1:AGL1LZnCUG4MnQtnWpBPbQ8ZpptaZs14w6kE/MWfg7s=
+github.com/grafana/dataplane/sdata v0.0.9/go.mod h1:Jvs5ddpGmn6vcxT7tCTWAZ1mgi4sbcdFt9utQx5uMAU=
+github.com/grafana/dskit v0.0.0-20250611075409-46f51e1ce914 h1:qcSGhr691f1mmPHwg2svGyO40Ex92G02aOyHzP6XHCE=
+github.com/grafana/dskit v0.0.0-20250611075409-46f51e1ce914/go.mod h1:OiN4P4aC6LwLzLbEupH3Ue83VfQoNMfG48rsna8jI/E=
+github.com/grafana/grafana-app-sdk v0.40.0 h1:KilbCFMYox2cnIi1W6ql7W+n9kms/NvWlBPM1m4Q4mg=
+github.com/grafana/grafana-app-sdk v0.40.0/go.mod h1:fn943JEM0CR3mY/Gd3816MUcpob5xnKc8MoojnbMjYY=
+github.com/grafana/grafana-app-sdk/logging v0.39.3 h1:mMrcYahnoRu7blKyL/ZVcgv7WCiI2CqxODYh8tBFUgY=
+github.com/grafana/grafana-app-sdk/logging v0.39.3/go.mod h1:otUD9XpJD7A5sCLb8mcs9hIXGdeV6lnhzVwe747g4RU=
+github.com/grafana/grafana-aws-sdk v1.0.4 h1:D14UAehsOqpjliHmHzveRQ1p43KCsMzdmb7GovWj+SY=
+github.com/grafana/grafana-aws-sdk v1.0.4/go.mod h1:hO7q7yWV+t6dmiyJjMa3IbuYnYkBua+G/IAlOPVIYKE=
+github.com/grafana/grafana-azure-sdk-go/v2 v2.1.6 h1:OfCkitCuomzZKW1WYHrG8MxKwtMhALb7jqoj+487eTg=
+github.com/grafana/grafana-azure-sdk-go/v2 v2.1.6/go.mod h1:V7y2BmsWxS3A9Ohebwn4OiSfJJqi//4JQydQ8fHTduo=
+github.com/grafana/grafana-plugin-sdk-go v0.278.0 h1:5/rIYparLi02pofdaag8wnjspMMVNCi8cZhC4cdC3Ho=
+github.com/grafana/grafana-plugin-sdk-go v0.278.0/go.mod h1:+8NXT/XUJ/89GV6FxGQ366NZ3nU+cAXDMd0OUESF9H4=
+github.com/grafana/grafana/apps/dashboard v0.0.0-20250716132114-6fd75ebc5441 h1:+TSbaxCXBZrKkdROWBzdWna8uStE1f9LYd7GiqjVfz8=
+github.com/grafana/grafana/apps/dashboard v0.0.0-20250716132114-6fd75ebc5441/go.mod h1:1XWiRSVuDQiayapHhQiDc4S4e9GzEZgg/3GeNCuDgn4=
+github.com/grafana/grafana/apps/folder v0.0.0-20250627191313-2f1a6ae1712b h1:31MwoIKKT9Ay0ZjbT4lkfcPijiWogUWzXs2EjrCgodI=
+github.com/grafana/grafana/apps/folder v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:dLtYBp1pza5HYalezNvzlP8JDeKrZ5BKTonDgEOE0NY=
+github.com/grafana/grafana/apps/secret v0.0.0-20250711114246-c9b2126c4ad5 h1:+fMhUoqwGdY8ntH0GL2icJa3uk+bTiIMicawDG2r9Uc=
+github.com/grafana/grafana/apps/secret v0.0.0-20250711114246-c9b2126c4ad5/go.mod h1:TIrKvhgo2j6lvVeOZ3TUmXbI4I48d6v7QcadL/f6SKQ=
+github.com/grafana/grafana/pkg/aggregator v0.0.0-20250627191313-2f1a6ae1712b h1:ei01IFqmnXkOrrVvsT3CYe+i5xYra3SCX7Wsu3PMsDU=
+github.com/grafana/grafana/pkg/aggregator v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:+H4Va9jDJlGQJjAN+OFD/hLx2I/yEzDRMQLaKecvgAc=
+github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250725144121-b1592b5e36d2 h1:lvmcK9XOJUJiYhl2kH4nwAKOUdq+ug+ueIGqfKlip3E=
+github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250725144121-b1592b5e36d2/go.mod h1:3ZgUe0E3rIhI026xF4DKFptOst/jpDHJ/Sn+bRODzI4=
+github.com/grafana/grafana/pkg/apiserver v0.0.0-20250627191313-2f1a6ae1712b h1:QyJLJn3xwFTIXu9KPZujsrIUN0X8DdiR9b2h75L0AfI=
+github.com/grafana/grafana/pkg/apiserver v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:6OKkPWDB8PetDXqMVMOWL35iTCEUdpATwwpuew0k8+o=
+github.com/grafana/grafana/pkg/promlib v0.0.8 h1:VUWsqttdf0wMI4j9OX9oNrykguQpZcruudDAFpJJVw0=
+github.com/grafana/grafana/pkg/promlib v0.0.8/go.mod h1:U1ezG/MGaEPoThqsr3lymMPN5yIPdVTJnDZ+wcXT+ao=
+github.com/grafana/grafana/pkg/semconv v0.0.0-20250627191313-2f1a6ae1712b h1:m78RNSvTseSpvwQYe5HcdsiADSw4vj6+QUppuCL63gw=
+github.com/grafana/grafana/pkg/semconv v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:mu3yl0GxB0eQZV1q7Kka0pkF3Th9x7W04WrjR9wqBlc=
+github.com/grafana/otel-profiling-go v0.5.1 h1:stVPKAFZSa7eGiqbYuG25VcqYksR6iWvF3YH66t4qL8=
+github.com/grafana/otel-profiling-go v0.5.1/go.mod h1:ftN/t5A/4gQI19/8MoWurBEtC6gFw8Dns1sJZ9W4Tls=
+github.com/grafana/prometheus-alertmanager v0.25.1-0.20250620093340-be61a673dee6 h1:oJnbhG6ZNy10AjsgNeAtAKeGHogIGOMfAsBH6fYYa5M=
+github.com/grafana/prometheus-alertmanager v0.25.1-0.20250620093340-be61a673dee6/go.mod h1:O/QP1BCm0HHIzbKvgMzqb5sSyH88rzkFk84F4TfJjBU=
+github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg=
+github.com/grafana/pyroscope-go/godeltaprof v0.1.8/go.mod h1:2+l7K7twW49Ct4wFluZD3tZ6e0SjanjcUUBPVD/UuGU=
+github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248=
+github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk=
+github.com/grafana/sqlds/v4 v4.2.3 h1:9ibD1c5O5u9fifEkBSig+jAc41TUEz+M+bWQqDsofP4=
+github.com/grafana/sqlds/v4 v4.2.3/go.mod h1:bv+XHabfUF4xkgg4y+nYFCK8rpMHZsMaQk56qNaJcAM=
+github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0 h1:QGLs/O40yoNK9vmy4rhUGBVyMf1lISBGtXRpsu/Qu/o=
+github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0/go.mod h1:hM2alZsMUni80N33RBe6J0e423LB+odMj7d3EMP9l20=
+github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 h1:sGm2vDRFUrQJO/Veii4h4zG2vvqG6uWNkBHSTqXOZk0=
+github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2/go.mod h1:wd1YpapPLivG6nQgbf7ZkG1hhSOXDhhn4MLTknx2aAc=
+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.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90=
+github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
+github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0=
+github.com/hashicorp/consul/api v1.31.2 h1:NicObVJHcCmyOIl7Z9iHPvvFrocgTYo9cITSGg0/7pw=
+github.com/hashicorp/consul/api v1.31.2/go.mod h1:Z8YgY0eVPukT/17ejW+l+C7zJmKwgPHtjU1q16v/Y40=
+github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
+github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
+github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ=
+github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48=
+github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
+github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ=
+github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=
+github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
+github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=
+github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-metrics v0.5.4 h1:8mmPiIJkTPPEbAiV97IxdAGNdRdaWwVap1BU6elejKY=
+github.com/hashicorp/go-metrics v0.5.4/go.mod h1:CG5yz4NZ/AI/aQt9Ucm/vdBnbh7fvmv4lxZ350i+QQI=
+github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
+github.com/hashicorp/go-msgpack/v2 v2.1.2 h1:4Ee8FTp834e+ewB71RDrQ0VKpyFdrKOjvYtnQ/ltVj0=
+github.com/hashicorp/go-msgpack/v2 v2.1.2/go.mod h1:upybraOAblm4S7rx0+jeNy+CWWhzywQsSRV5033mMu4=
+github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
+github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA=
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
-github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso=
-github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA=
+github.com/hashicorp/go-plugin v1.6.3 h1:xgHB+ZUSYeuJi96WtxEjzi23uh7YQpznjGh0U0UUrwg=
+github.com/hashicorp/go-plugin v1.6.3/go.mod h1:MRobyh+Wc/nYy1V4KAXUiYfzxoYhs7V1mlH1Z7iY2h0=
+github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
+github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc=
+github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8=
+github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
+github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw=
+github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw=
+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.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8=
+github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
+github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
+github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=
+github.com/hashicorp/golang-lru v1.0.2/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/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
+github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
+github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc=
+github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE=
+github.com/hashicorp/memberlist v0.5.2 h1:rJoNPWZ0juJBgqn48gjy59K5H4rNgvUoM1kUD7bXiuI=
+github.com/hashicorp/memberlist v0.5.2/go.mod h1:Ri9p/tRShbjYnpNf4FFPXG7wxEGY4Nrcn6E7jrVa//4=
+github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=
+github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4=
+github.com/hashicorp/serf v0.10.2 h1:m5IORhuNSjaxeljg5DeQVDlQyVkhRIjJDimbkCa8aAc=
+github.com/hashicorp/serf v0.10.2/go.mod h1:T1CmSGfSeGfnfNy/w0odXQUR1rfECGd2Qdsp84DjOiY=
+github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE=
+github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI=
+github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
+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=
+github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8=
+github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw=
+github.com/invopop/jsonschema v0.13.0 h1:KvpoAJWEjR3uD9Kbm2HWJmqsEaHt8lBUpd0qHcIi21E=
+github.com/invopop/jsonschema v0.13.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0=
+github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
+github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I=
+github.com/jaegertracing/jaeger-idl v0.5.0 h1:zFXR5NL3Utu7MhPg8ZorxtCBjHrL3ReM1VoB65FOFGE=
+github.com/jaegertracing/jaeger-idl v0.5.0/go.mod h1:ON90zFo9eoyXrt9F/KN8YeF3zxcnujaisMweFY/rg5k=
+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/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c=
+github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo=
+github.com/jmespath-community/go-jmespath v1.1.1 h1:bFikPhsi/FdmlZhVgSCd2jj1e7G/rw+zyQfyg5UF+L4=
+github.com/jmespath-community/go-jmespath v1.1.1/go.mod h1:4gOyFJsR/Gk+05RgTKYrifT7tBPWD8Lubtb5jRrfy9I=
+github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
+github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
+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 v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g=
+github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
+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.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
+github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 h1:SwcnSwBR7X/5EHJQlXBockkJVIMRVt5yKaesBPMtyZQ=
+github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6/go.mod h1:WrYiIuiXUMIvTDAQw97C+9l0CnBmCcvosPjN3XDqS/o=
+github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
+github.com/keybase/go-keychain v0.0.1 h1:way+bWYa6lDppZoZcgMbYsvC7GxljxrskdNInRtuthU=
+github.com/keybase/go-keychain v0.0.1/go.mod h1:PdEILRW3i9D8JcdM+FmY6RwkHGnhHxXwkPPMeUgOK1k=
+github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
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/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
-github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
+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.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
+github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
+github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
+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=
+github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
+github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
+github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
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/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/kshvakov/clickhouse v1.3.5/go.mod h1:DMzX7FxRymoNkVgizH0DWAL8Cur7wHLgx3MUnGwJqpE=
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/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
-github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
+github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8=
+github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc/go.mod h1:kopuH9ugFRkIXf3YoqHKyrJ9YfUFsckUU9S7B+XP+is=
+github.com/lestrrat-go/strftime v1.0.4 h1:T1Rb9EPkAhgxKqbcMIPguPq8glqXTA1koF8n9BHElA8=
+github.com/lestrrat-go/strftime v1.0.4/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR76fd03sz+Qz4g=
+github.com/lib/pq v1.0.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.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
+github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+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.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60=
+github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=
+github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
+github.com/mattbaird/jsonpatch v0.0.0-20240118010651-0ba75a80ca38 h1:hQWBtNqRYrI7CWIaUSXXtNKR90KzcUA5uiuxFVWw7sU=
+github.com/mattbaird/jsonpatch v0.0.0-20240118010651-0ba75a80ca38/go.mod h1:M1qoD/MqPgTZIk0EWKB38wE28ACRfVcn+cU08jyArI0=
+github.com/mattetti/filebuffer v1.0.1 h1:gG7pyfnSIZCxdoKq+cPa8T0hhYtD9NxCdI4D7PTjRLM=
+github.com/mattetti/filebuffer v1.0.1/go.mod h1:YdMURNDOttIiruleeVr6f56OrMc+MydEnTcXwtkxNVs=
+github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
+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=
+github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
+github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
+github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
+github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
+github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+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=
+github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
+github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
+github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
+github.com/mattn/go-sqlite3 v1.10.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.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
+github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
+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/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U=
+github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
+github.com/mdlayher/vsock v1.2.1 h1:pC1mTJTvjo1r9n9fbm7S1j04rCgCzhCOS5DY0zqHlnQ=
+github.com/mdlayher/vsock v1.2.1/go.mod h1:NRfCibel++DgeMD8z/hP+PPTjlNJsdPOmxcnENvE+SE=
+github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso=
+github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI=
+github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY=
+github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs=
+github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs=
+github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY=
+github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI=
+github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE=
+github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI=
+github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
+github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
+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/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
+github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE=
+github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
+github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
+github.com/mithrandie/csvq v1.18.1 h1:f7NB2scbb7xx2ffPduJ2VtZ85RpWXfvanYskAkGlCBU=
+github.com/mithrandie/csvq v1.18.1/go.mod h1:MRJj7AtcXfk7jhNGxLuJGP3LORmh4lpiPWxQ7VyCRn8=
+github.com/mithrandie/csvq-driver v1.7.0 h1:ejiavXNWwTPMyr3fJFnhcqd1L1cYudA0foQy9cZrqhw=
+github.com/mithrandie/csvq-driver v1.7.0/go.mod h1:HcN3xL9UCJnBYA/AIQOOB/KlyfXAiYr5yxDmiwrGk5o=
+github.com/mithrandie/go-file/v2 v2.1.0 h1:XA5Tl+73GXMDvgwSE3Sg0uC5FkLr3hnXs8SpUas0hyg=
+github.com/mithrandie/go-file/v2 v2.1.0/go.mod h1:9YtTF3Xo59GqC1Pxw6KyGVcM/qubAMlxVsqI/u9r++c=
+github.com/mithrandie/go-text v1.6.0 h1:8gOXTMPbMY8DJbKMTv8kHhADcJlDWXqS/YQH4SyWO6s=
+github.com/mithrandie/go-text v1.6.0/go.mod h1:xCgj1xiNbI/d4xA9sLVvXkjh5B2tNx2ZT2/3rpmh8to=
+github.com/mithrandie/ternary v1.1.1 h1:k/joD6UGVYxHixYmSR8EGgDFNONBMqyD373xT4QRdC4=
+github.com/mithrandie/ternary v1.1.1/go.mod h1:0D9Ba3+09K2TdSZO7/bFCC0GjSXetCvYuYq0u8FY/1g=
+github.com/mocktools/go-smtp-mock/v2 v2.3.1 h1:wq75NDSsOy5oHo/gEQQT0fRRaYKRqr1IdkjhIPXxagM=
+github.com/mocktools/go-smtp-mock/v2 v2.3.1/go.mod h1:h9AOf/IXLSU2m/1u4zsjtOM/WddPwdOUBz56dV9f81M=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
+github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
+github.com/mschoch/smat v0.2.0 h1:8imxQsjDm8yFEAVBe7azKmKSgzSkZXDuKkSq9374khM=
+github.com/mschoch/smat v0.2.0/go.mod h1:kc9mz7DoBKqDyiRL7VZN8KvXQMWeTaVnttLRXOlotKw=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
-github.com/onsi/ginkgo/v2 v2.21.0 h1:7rg/4f3rB88pb5obDgNZrNHrQ4e6WpjonchcpuBRnZM=
-github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
-github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4=
-github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
-github.com/openfga/openfga v1.8.12 h1:xEirA6tFwaJfjBDtbHWCK0/Tw+B8XleRyhg9dcEpzHo=
-github.com/openfga/openfga v1.8.12/go.mod h1:fIZyekdNB+tWQ6zIiglZonAc5ErZiDGMeHue/BzRYRM=
-github.com/openfga/openfga v1.8.13 h1:ROURkotKhbmtyBX3188+cNElN8AOZmTl0CMkxUqwawo=
-github.com/openfga/openfga v1.8.13/go.mod h1:h1VGcVW81eY1YyDtFx5+gxxAIEhIiOGR9SRGgs/X/k8=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA=
+github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
+github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
+github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 h1:G7ERwszslrBzRxj//JalHPu/3yz+De2J+4aLtSRlHiY=
+github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037/go.mod h1:2bpvgLBZEtENV5scfDFEtB/5+1M4hkQhDQrccEJ/qGw=
+github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 h1:bQx3WeLcUWy+RletIKwUIt4x3t8n2SxavmoclizMb8c=
+github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o=
+github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA=
+github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU=
+github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
+github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
+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.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
+github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
+github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU=
+github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk=
+github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
+github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY=
+github.com/open-feature/go-sdk v1.14.1 h1:jcxjCIG5Up3XkgYwWN5Y/WWfc6XobOhqrIwjyDBsoQo=
+github.com/open-feature/go-sdk v1.14.1/go.mod h1:t337k0VB/t/YxJ9S0prT30ISUHwYmUd/jhUZgFcOvGg=
+github.com/open-feature/go-sdk-contrib/providers/go-feature-flag v0.2.3 h1:6jpO63NCEZv4xunJj+aNlDuFVuRkVBPMcIuxvFPYRWQ=
+github.com/open-feature/go-sdk-contrib/providers/go-feature-flag v0.2.3/go.mod h1:dPUHjAIFzg+ci/wt6XxlNiiMkOh5Yw4SGyeRY0AFT0g=
+github.com/open-feature/go-sdk-contrib/providers/ofrep v0.1.5 h1:ZdqlGnNwhWf3luhBQlIpbglvcCzjkcuEgOEhYhr5Emc=
+github.com/open-feature/go-sdk-contrib/providers/ofrep v0.1.5/go.mod h1:jrD4UG3ZCzuwImKHlyuIN2iWeYjlOX5+zJ/sX45efuE=
+github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
+github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
+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=
+github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
+github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs=
+github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc=
+github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
+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/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.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
+github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s=
github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw=
+github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU=
+github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
+github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
+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=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg=
+github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo=
+github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/prometheus/client_golang v1.20.5 h1:cxppBPuYhUnsO6yo/aoRol4L7q7UFfdm+bR9r+8l63Y=
-github.com/prometheus/client_golang v1.20.5/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE=
-github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg=
+github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
+github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
+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=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
-github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
-github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
-github.com/prometheus/common v0.61.0 h1:3gv/GThfX0cV2lpO7gkTUwZru38mxevy90Bj8YFSRQQ=
-github.com/prometheus/common v0.61.0/go.mod h1:zr29OCN/2BsJRaFwG8QOBr41D6kkchKbpeNH7pAjb/s=
-github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
-github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18=
-github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
-github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
-github.com/prometheus/procfs v0.16.0/go.mod h1:8veyXUu3nGP7oaCxhX6yeaM5u4stL2FeMXnCqhDthZg=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
+github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
+github.com/prometheus/common v0.2.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=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
+github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls=
+github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE=
+github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
+github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4=
+github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI=
+github.com/prometheus/exporter-toolkit v0.14.0 h1:NMlswfibpcZZ+H0sZBiTjrA3/aBFHkNZqE+iCj5EmRg=
+github.com/prometheus/exporter-toolkit v0.14.0/go.mod h1:Gu5LnVvt7Nr/oqTBUC23WILZepW0nffNo10XdhQcwWA=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/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.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+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=
+github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
+github.com/prometheus/prometheus v0.303.1 h1:He/2jRE6sB23Ew38AIoR1WRR3fCMgPlJA2E0obD2WSY=
+github.com/prometheus/prometheus v0.303.1/go.mod h1:WEq2ogBPZoLjj9x5K67VEk7ECR0nRD9XCjaOt1lsYck=
github.com/puzpuzpuz/xsync/v2 v2.5.1 h1:mVGYAvzDSu52+zaGyNjC+24Xw2bQi3kTr4QJ6N9pIIU=
github.com/puzpuzpuz/xsync/v2 v2.5.1/go.mod h1:gD2H2krq/w52MfPLE+Uy64TzJDVY7lP2znR9qmR35kU=
-github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
-github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
-github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
+github.com/redis/go-redis/v9 v9.7.3 h1:YpPyAayJV+XErNsatSElgRZZVCwXX9QzkKYNvO7x0wM=
+github.com/redis/go-redis/v9 v9.7.3/go.mod h1:bGUrSggJ9X9GUmZpZNEOQKaANxSGgOEBRltRTZHSvrA=
+github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
+github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
+github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
+github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
+github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
+github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
+github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA=
+github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
+github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts=
+github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8=
+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
+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/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
+github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
+github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
+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/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.2.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.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
+github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
+github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 h1:Jpy1PXuP99tXNrhbq2BaPz9B+jNAvH1JPQQpG/9GCXY=
+github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c h1:Ho+uVpkel/udgjbwB5Lktg9BtvJSh2DT0Hi6LPSyI2w=
+github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo=
+github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU=
+github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
+github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
+github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo=
+github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0=
+github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/viper v1.13.0/go.mod h1:Icm2xNL3/8uyh/wFuB1jI7TiTNKp8632Nwegu+zgdYw=
+github.com/spiffe/go-spiffe/v2 v2.5.0 h1:N2I01KCUkv1FAjZXJMwh95KK1ZIQLYbPfhaxw8WS0hE=
+github.com/spiffe/go-spiffe/v2 v2.5.0/go.mod h1:P+NxobPc6wXhVtINNtFjNWGBTreew1GBUCwT2wPmb7g=
+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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
+github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
+github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/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/tetratelabs/wazero v1.8.2 h1:yIgLR/b2bN31bjxwXHD8a3d+BogigR952csSDdLYEv4=
+github.com/tetratelabs/wazero v1.8.2/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs=
+github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
+github.com/tjhop/slog-gokit v0.1.3 h1:6SdexP3UIeg93KLFeiM1Wp1caRwdTLgsD/THxBUy1+o=
+github.com/tjhop/slog-gokit v0.1.3/go.mod h1:Bbu5v2748qpAWH7k6gse/kw3076IJf6owJmh7yArmJs=
+github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
+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 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/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
+github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8 h1:aVGB3YnaS/JNfOW3tiHIlmNmTDg618va+eT0mVomgyI=
+github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8/go.mod h1:fVle4kNr08ydeohzYafr20oZzbAkhQT39gKK/pFQ5M4=
+github.com/unknwon/com v1.0.1 h1:3d1LTxD+Lnf3soQiD4Cp/0BRB+Rsa/+RTvz8GMMzIXs=
+github.com/unknwon/com v1.0.1/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM=
+github.com/unknwon/log v0.0.0-20150304194804-e617c87089d3/go.mod h1:1xEUf2abjfP92w2GZTV+GgaRxXErwRXcClbUwrNJffU=
+github.com/unknwon/log v0.0.0-20200308114134-929b1006e34a h1:vcrhXnj9g9PIE+cmZgaPSwOyJ8MAQTRmsgGrB0x5rF4=
+github.com/unknwon/log v0.0.0-20200308114134-929b1006e34a/go.mod h1:1xEUf2abjfP92w2GZTV+GgaRxXErwRXcClbUwrNJffU=
+github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
+github.com/urfave/cli v1.22.16 h1:MH0k6uJxdwdeWQTwhSO42Pwr4YLrNLwBtg1MRgTqPdQ=
+github.com/urfave/cli v1.22.16/go.mod h1:EeJR6BKodywf4zciqrdw6hpCPk68JO9z5LazXZMn5Po=
+github.com/wk8/go-ordered-map v1.0.0 h1:BV7z+2PaK8LTSd/mWgY12HyMAo5CEgkHqbkVq2thqr8=
+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/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
+github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs=
+github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
+github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
+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=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=
+github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
+github.com/zeebo/errs v1.4.0 h1:XNdoD/RRMKP7HD0UhJnIzUy74ISdGGxURlYG8HSWSfM=
+github.com/zeebo/errs v1.4.0/go.mod h1:sgbWHsvVuTPHcqJJGQ1WhI5KbWlHYz+2+2C/LSEtCw4=
+github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
+github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
+gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE=
+go.etcd.io/bbolt v1.4.0 h1:TU77id3TnN/zKr7CO/uk+fBCwF2jGcMuw2B/FMAzYIk=
+go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk=
+go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A=
+go.etcd.io/etcd/api/v3 v3.5.21 h1:A6O2/JDb3tvHhiIz3xf9nJ7REHvtEFJJ3veW3FbCnS8=
+go.etcd.io/etcd/api/v3 v3.5.21/go.mod h1:c3aH5wcvXv/9dqIw2Y810LDXJfhSYdHQ0vxmP3CCHVY=
+go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g=
+go.etcd.io/etcd/client/pkg/v3 v3.5.21 h1:lPBu71Y7osQmzlflM9OfeIV2JlmpBjqBNlLtcoBqUTc=
+go.etcd.io/etcd/client/pkg/v3 v3.5.21/go.mod h1:BgqT/IXPjK9NkeSDjbzwsHySX3yIle2+ndz28nVsjUs=
+go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU=
+go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY=
+go.etcd.io/etcd/client/v3 v3.5.21 h1:T6b1Ow6fNjOLOtM0xSoKNQt1ASPCLWrF9XMHcH9pEyY=
+go.etcd.io/etcd/client/v3 v3.5.21/go.mod h1:mFYy67IOqmbRf/kRUvsHixzo3iG+1OF2W2+jVIQRAnU=
+go.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
+go.mongodb.org/mongo-driver v1.16.1 h1:rIVLL3q0IHM39dvE+z2ulZLp9ENZKThVfuvN/IiN4l8=
+go.mongodb.org/mongo-driver v1.16.1/go.mod h1:oB6AhJQvFQL4LEHyXi6aJzQJtBiTQHiAd83l0GdFaiw=
+go.opencensus.io v0.20.1/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.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=
+go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
+go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E=
+go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
+go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
-go.opentelemetry.io/otel v1.33.0 h1:/FerN9bax5LoK51X/sI0SVYrjSE0/yUL7DpxW4K3FWw=
-go.opentelemetry.io/otel v1.33.0/go.mod h1:SUUkR6csvUQl+yjReHu5uM3EtVV7MBm5FHKRlNx4I8I=
-go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
-go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
-go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 h1:Vh5HayB/0HHfOQA7Ctx69E/Y/DcQSMPpKANYVMQ7fBA=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0/go.mod h1:cpgtDBaqD/6ok/UG0jT15/uKjAY8mRA53diogHBg3UI=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0/go.mod h1:zjPK58DtkqQFn+YUMbx0M2XV3QgKU0gS9LeGohREyK4=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0/go.mod h1:90PoxvaEB5n6AOdZvi+yWJQoE95U8Dhhw2bSyRqnTD0=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 h1:5pojmb1U1AogINhN3SurB+zm/nIcusopeBNp42f45QM=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0/go.mod h1:57gTHJSE5S1tqg+EKsLPlTWhpHMsWlVmer+LA926XiA=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.34.0/go.mod h1:U7HYyW0zt/a9x5J1Kjs+r1f/d4ZHnYFclhYY2+YbeoE=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0/go.mod h1:LjReUci/F4BUyv+y4dwnq3h/26iNOeC3wAIqgvTIZVo=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0/go.mod h1:179AK5aar5R3eS9FucPy6rggvU0g52cvKId8pv4+v0c=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0 h1:wpMfgF8E1rkrT1Z6meFh1NDtownE9Ii3n3X2GJYjsaU=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.33.0/go.mod h1:wAy0T/dUbs468uOlkT31xjvqQgEVXv58BRFWEgn5v/0=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.34.0/go.mod h1:9cKLGBDzI/F3NoHLQGm4ZrYdIHsvGt6ej6hUowxY0J4=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0/go.mod h1:u5BF1xyjstDowA1R5QAO9JHzqK+ublenEW/dyqTjBVk=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.36.0/go.mod h1:r49hO7CgrxY9Voaj3Xe8pANWtr0Oq916d0XAmOoCZAQ=
-go.opentelemetry.io/otel/metric v1.33.0 h1:r+JOocAyeRVXD8lZpjdQjzMadVZp2M4WmQ+5WtEnklQ=
-go.opentelemetry.io/otel/metric v1.33.0/go.mod h1:L9+Fyctbp6HFTddIxClbQkjtubW6O9QS3Ann/M82u6M=
-go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
-go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
-go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs=
-go.opentelemetry.io/otel/sdk v1.33.0 h1:iax7M131HuAm9QkZotNHEfstof92xM+N8sr3uHXc2IM=
-go.opentelemetry.io/otel/sdk v1.33.0/go.mod h1:A1Q5oi7/9XaMlIWzPSxLRWOI8nG3FnzHJNbiENQuihM=
-go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
-go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg=
-go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY=
-go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc=
-go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8=
-go.opentelemetry.io/otel/trace v1.33.0 h1:cCJuF7LRjUFso9LPnEAHJDB2pqzp+hbO8eu1qqW2d/s=
-go.opentelemetry.io/otel/trace v1.33.0/go.mod h1:uIcdVUZMpTAmz0tI1z04GoVSezK37CbGV4fr1f2nBck=
-go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
-go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
-go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
-go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4=
-go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4=
-go.opentelemetry.io/proto/otlp v1.6.0/go.mod h1:cicgGehlFuNdgZkcALOCh3VE6K/u2tAjzlRhDwmVpZc=
+go.opentelemetry.io/contrib/bridges/prometheus v0.61.0 h1:RyrtJzu5MAmIcbRrwg75b+w3RlZCP0vJByDVzcpAe3M=
+go.opentelemetry.io/contrib/bridges/prometheus v0.61.0/go.mod h1:tirr4p9NXbzjlbruiRGp53IzlYrDk5CO2fdHj0sSSaY=
+go.opentelemetry.io/contrib/detectors/gcp v1.36.0 h1:F7q2tNlCaHY9nMKHR6XH9/qkp8FktLnIcy6jJNyOCQw=
+go.opentelemetry.io/contrib/detectors/gcp v1.36.0/go.mod h1:IbBN8uAIIx734PTonTPxAxnjc2pQTxWNkwfstZ+6H2k=
+go.opentelemetry.io/contrib/exporters/autoexport v0.61.0 h1:XfzKtKSrbtYk9TNCF8dkO0Y9M7IOfb4idCwBOTwGBiI=
+go.opentelemetry.io/contrib/exporters/autoexport v0.61.0/go.mod h1:N6otC+qXTD5bAnbK2O1f/1SXq3cX+3KYSWrkBUqG0cw=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM=
+go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.61.0 h1:lREC4C0ilyP4WibDhQ7Gg2ygAQFP8oR07Fst/5cafwI=
+go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.61.0/go.mod h1:HfvuU0kW9HewH14VCOLImqKvUgONodURG7Alj/IrnGI=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY=
+go.opentelemetry.io/contrib/propagators/jaeger v1.36.0 h1:SoCgXYF4ISDtNyfLUzsGDaaudZVTx2yJhOyBO0+/GYk=
+go.opentelemetry.io/contrib/propagators/jaeger v1.36.0/go.mod h1:VHu48l0YTRKSObdPQ+Sb8xMZvdnJlN7yhHuHoPgNqHM=
+go.opentelemetry.io/contrib/samplers/jaegerremote v0.30.0 h1:bQ1Gvah4Sp8z7epSkgJaNTuZm7sutfA6Fji2/7cKFMc=
+go.opentelemetry.io/contrib/samplers/jaegerremote v0.30.0/go.mod h1:9b8Q9rH52NgYH3ShiTFB5wf18Vt3RTH/VMB7LDcC1ug=
+go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=
+go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
+go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
+go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4=
+go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI=
+go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 h1:06ZeJRe5BnYXceSM9Vya83XXVaNGe3H1QqsvqRANQq8=
+go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2/go.mod h1:DvPtKE63knkDVP88qpatBj81JxN+w1bqfVbsbCbj1WY=
+go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2 h1:tPLwQlXbJ8NSOfZc4OkgU5h2A38M4c9kfHSVc4PFQGs=
+go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2/go.mod h1:QTnxBwT/1rBIgAG1goq6xMydfYOBKU6KTiYF4fp5zL8=
+go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0 h1:zG8GlgXCJQd5BU98C0hZnBbElszTmUgCNCfYneaDL0A=
+go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0/go.mod h1:hOfBCz8kv/wuq73Mx2H2QnWokh/kHZxkh6SNF2bdKtw=
+go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.37.0 h1:9PgnL3QNlj10uGxExowIDIZu66aVBwWhXmbOp1pa6RA=
+go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.37.0/go.mod h1:0ineDcLELf6JmKfuo0wvvhAVMuxWFYvkTin2iV4ydPQ=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0 h1:bDMKF3RUSxshZ5OjOTi8rsHGaPKsAt76FaqgvIUySLc=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0/go.mod h1:dDT67G/IkA46Mr2l9Uj7HsQVwsjASyV9SjGofsiUZDA=
+go.opentelemetry.io/otel/exporters/prometheus v0.59.0 h1:HHf+wKS6o5++XZhS98wvILrLVgHxjA/AMjqHKes+uzo=
+go.opentelemetry.io/otel/exporters/prometheus v0.59.0/go.mod h1:R8GpRXTZrqvXHDEGVH5bF6+JqAZcK8PjJcZ5nGhEWiE=
+go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.12.2 h1:12vMqzLLNZtXuXbJhSENRg+Vvx+ynNilV8twBLBsXMY=
+go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.12.2/go.mod h1:ZccPZoPOoq8x3Trik/fCsba7DEYDUnN6yX79pgp2BUQ=
+go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY=
+go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw=
+go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0 h1:SNhVp/9q4Go/XHBkQ1/d5u9P/U+L1yaGPoi0x+mStaI=
+go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0/go.mod h1:tx8OOlGH6R4kLV67YaYO44GFXloEjGPZuMjEkaaqIp4=
+go.opentelemetry.io/otel/log v0.12.2 h1:yob9JVHn2ZY24byZeaXpTVoPS6l+UrrxmxmPKohXTwc=
+go.opentelemetry.io/otel/log v0.12.2/go.mod h1:ShIItIxSYxufUMt+1H5a2wbckGli3/iCfuEbVZi/98E=
+go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=
+go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
+go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
+go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=
+go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
+go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
+go.opentelemetry.io/otel/sdk/log v0.12.2 h1:yNoETvTByVKi7wHvYS6HMcZrN5hFLD7I++1xIZ/k6W0=
+go.opentelemetry.io/otel/sdk/log v0.12.2/go.mod h1:DcpdmUXHJgSqN/dh+XMWa7Vf89u9ap0/AAk/XGLnEzY=
+go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
+go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
+go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=
+go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
+go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
+go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
+go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os=
+go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo=
+go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
+go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
+go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
+go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
+go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
+go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
+go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
+go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
+go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
+go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
+go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE=
+go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI=
+gocloud.dev v0.42.0 h1:qzG+9ItUL3RPB62/Amugws28n+4vGZXEoJEAMfjutzw=
+gocloud.dev v0.42.0/go.mod h1:zkaYAapZfQisXOA4bzhsbA4ckiStGQ3Psvs9/OQ5dPM=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/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-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+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-20190605123033-f99c8df09eb5/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-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
-golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
+golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
+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/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
+golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/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-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-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
+golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
+golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
+golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
+golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
+golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
+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=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
+golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
+golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
+golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
+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/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
+golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
+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-20180906233101-161cd47e91fd/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-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-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-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-20190923162816-aa69164e4478/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-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=
+golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
+golang.org/x/net v0.0.0-20200513185701-a91f0712d120/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-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=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0=
-golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k=
-golang.org/x/net v0.36.0 h1:vWF2fRbw4qslQsQzgFqZff+BItCvGFQqKzKIzx1rmoA=
-golang.org/x/net v0.36.0/go.mod h1:bFmbeoIPfrw4sMHNhb4J9f6+tPziuGjq7Jk/38fxi1I=
-golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
-golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
-golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
-golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
+golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
+golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
+golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
+golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220325170049-de3da57026de/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220412020605-290c469a71a5/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220425223048-2871e0cb64e4/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+golang.org/x/net v0.0.0-20220520000938-2e3eb7b945c2/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
+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/net v0.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
-golang.org/x/oauth2 v0.25.0 h1:CY4y7XT9v0cRI9oupztF8AgiIu99L/ksR/Xp/6jrZ70=
-golang.org/x/oauth2 v0.25.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
-golang.org/x/oauth2 v0.27.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
-golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/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=
+golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
+golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20211005180243-6b3c2da341f1/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
+golang.org/x/oauth2 v0.0.0-20220223155221-ee480838109b/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/oauth2 v0.0.0-20220309155454-6242fa91716a/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/oauth2 v0.0.0-20220411215720-9780585627b5/go.mod h1:DAh4E804XQdzx2j+YRIaUnCqCV2RuMz24cGBJ5QYIrc=
+golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
+golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
-golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
-golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
-golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220513210516-0976fa681c29/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/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
+golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+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-20180905080454-ebe1bf3edb33/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-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-20190102155601-82a175fd1598/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+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-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/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-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+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-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=
+golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+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-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-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
-golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
-golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211210111614-af8b64212486/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220128215802-99c3d69c2c27/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220328115105-d36c6a25d886/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220502124256-b6088ccd6cba/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.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.14.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.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
-golang.org/x/term v0.28.0 h1:/Ts8HFuMR2E6IP/jlo7QVLZHggjKQbhu/7H0LJFr3Gg=
-golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek=
-golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s=
-golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
+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/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
+golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
+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=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
-golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
-golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
-golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
-golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
+golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.6/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/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
-golang.org/x/time v0.9.0 h1:EsRrnYcQiGH+5FfbgvV4AP7qEZstoyrHB0DzarOQ4ZY=
-golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/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.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
+golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
+golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/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-20190114222345-bf090417da8b/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-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190425222832-ad9eeb80039a/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/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-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
+golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/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-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+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-20191227053925-7b8e75db28f4/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-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-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-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-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-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-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=
+golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE=
+golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.29.0 h1:Xx0h3TtM9rzQpQuR4dKLrdglAmCEN5Oi+P74JdhdzXE=
-golang.org/x/tools v0.29.0/go.mod h1:KMQVMRsVxU6nHCFXrBPhDB8XncLNLM0lIy/F14RP588=
+golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
+golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+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/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
+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/go.mod h1:xsh6VxdV005rRVaS6SSAf9oiAqljS7UZUacMZ8Bnsps=
+golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
+golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-gomodules.xyz/jsonpatch/v2 v2.4.0 h1:Ci3iUJyx9UeRx7CeFN8ARgGbkESwJK+KB9lLcWxY/Zw=
-gomodules.xyz/jsonpatch/v2 v2.4.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
+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-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY=
+golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
+gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0=
gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
-google.golang.org/genproto/googleapis/api v0.0.0-20250102185135-69823020774d h1:H8tOf8XM88HvKqLTxe755haY6r1fqqzLbEnfrmLXlSA=
-google.golang.org/genproto/googleapis/api v0.0.0-20250102185135-69823020774d/go.mod h1:2v7Z7gP2ZUOGsaFyxATQSRoBnKygqVq2Cwnvom7QiqY=
-google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:Ic02D47M+zbarjYYUlK57y316f2MoN0gjAwI3f2S95o=
-google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a/go.mod h1:3kWAYMk1I75K4vykHtKt2ycnOgpA6974V7bREqbsenU=
-google.golang.org/genproto/googleapis/api v0.0.0-20250428153025-10db94c68c34/go.mod h1:0awUlEkap+Pb1UMeJwJQQAdJQrt3moU7J2moTy69irI=
-google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237/go.mod h1:ezi0AVyMKDWy5xAncvjLWH7UcLBB5n7y2fQ8MzjJcto=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d h1:xJJRGY7TJcvIlpSrN3K6LAWgNFUILlO+OMAqtg9aqnw=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d/go.mod h1:3ENsm/5D1mzDyhpzeRi1NR784I0BcofWBoSc5QqqMK4=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250218202821-56aae31c358a/go.mod h1:uRxBH1mhmO8PGhU89cMcHaXKZqO+OfakD8QQO0oYwlQ=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250428153025-10db94c68c34/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
-google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A=
-google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4=
-google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec=
-google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
-google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
+gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
+gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
+google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
+google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
+google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
+google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
+google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
+google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
+google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
+google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
+google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg=
+google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE=
+google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8=
+google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU=
+google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94=
+google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo=
+google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4=
+google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw=
+google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU=
+google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k=
+google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
+google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE=
+google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI=
+google.golang.org/api v0.59.0/go.mod h1:sT2boj7M9YJxZzgeZqXogmhfmRWDtPzT31xkieUbuZU=
+google.golang.org/api v0.61.0/go.mod h1:xQRti5UdCmoCEqFxcz93fTl338AVqDgyaDRuOZ3hg9I=
+google.golang.org/api v0.63.0/go.mod h1:gs4ij2ffTRXwuzzgJl/56BdwJaA194ijkfn++9tDuPo=
+google.golang.org/api v0.67.0/go.mod h1:ShHKP8E60yPsKNw/w8w+VYaj9H6buA5UqDp8dhbQZ6g=
+google.golang.org/api v0.70.0/go.mod h1:Bs4ZM2HGifEvXwd50TtW70ovgJffJYw2oRCOFU/SkfA=
+google.golang.org/api v0.71.0/go.mod h1:4PyU6e6JogV1f9eA4voyrTY2batOLdgZ5qZ5HOCc4j8=
+google.golang.org/api v0.74.0/go.mod h1:ZpfMZOVRMywNyvJFeqL9HRWBgAuRfSjJFpe9QtRRyDs=
+google.golang.org/api v0.75.0/go.mod h1:pU9QmyHLnzlpar1Mjt4IbapUCy8J+6HD6GeELN69ljA=
+google.golang.org/api v0.78.0/go.mod h1:1Sg78yoMLOhlQTeF+ARBoytAcH1NNyyl390YMy6rKmw=
+google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko=
+google.golang.org/api v0.235.0 h1:C3MkpQSRxS1Jy6AkzTGKKrpSCOd2WOGrezZ+icKSkKo=
+google.golang.org/api v0.235.0/go.mod h1:QpeJkemzkFKe5VCE/PMv7GsUfn9ZF+u+q1Q7w6ckxTg=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
+google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+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-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=
+google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
+google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
+google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
+google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
+google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
+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-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-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
+google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A=
+google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A=
+google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0=
+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-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=
+google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48=
+google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w=
+google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
+google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20211008145708-270636b82663/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20211028162531-8db9c33dc351/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20211206160659-862468c7d6e0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20211208223120-3a66f561d7aa/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20211221195035-429b39de9b1c/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20220126215142-9970aeb2e350/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20220207164111-0872dc986b00/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc=
+google.golang.org/genproto v0.0.0-20220218161850-94dd64e39d7c/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
+google.golang.org/genproto v0.0.0-20220222213610-43724f9ea8cf/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
+google.golang.org/genproto v0.0.0-20220304144024-325a89244dc8/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
+google.golang.org/genproto v0.0.0-20220310185008-1973136f34c6/go.mod h1:kGP+zUP2Ddo0ayMi4YuN7C3WZyJvGLZRh8Z5wnAqvEI=
+google.golang.org/genproto v0.0.0-20220324131243-acbaeb5b85eb/go.mod h1:hAL49I2IFola2sVEjAn7MEwsja0xp51I0tlGAf9hz4E=
+google.golang.org/genproto v0.0.0-20220407144326-9054f6ed7bac/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
+google.golang.org/genproto v0.0.0-20220413183235-5e96e2839df9/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
+google.golang.org/genproto v0.0.0-20220414192740-2d67ff6cf2b4/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
+google.golang.org/genproto v0.0.0-20220421151946-72621c1f0bd3/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
+google.golang.org/genproto v0.0.0-20220429170224-98d788798c3e/go.mod h1:8w6bsBMX6yCPbAVTeqQHvzxW0EIFigd5lZyahWgyfDo=
+google.golang.org/genproto v0.0.0-20220505152158-f39f71e6c8f3/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
+google.golang.org/genproto v0.0.0-20220519153652-3a47de7e79bd/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
+google.golang.org/genproto v0.0.0-20250603155806-513f23925822 h1:rHWScKit0gvAPuOnu87KpaYtjK5zBMLcULh7gxkCXu4=
+google.golang.org/genproto v0.0.0-20250603155806-513f23925822/go.mod h1:HubltRL7rMh0LfnQPkMH4NPDFEWp0jw3vixw7jEM53s=
+google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY=
+google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
+google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
+google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
+google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
+google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
+google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
+google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
+google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8=
+google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
+google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
+google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
+google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE=
+google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
+google.golang.org/grpc v1.40.1/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
+google.golang.org/grpc v1.44.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU=
+google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ=
+google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
+google.golang.org/grpc v1.46.2/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
+google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok=
google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc=
-google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk=
-google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
-google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
-google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw=
+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=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
+google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
+google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
+google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
+google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
+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=
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=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4=
gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/fsnotify/fsnotify.v1 v1.4.7 h1:XNNYLJHt73EyYiCZi6+xjupS9CpvmiDgjPTAjrBlQbo=
+gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE=
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
+gopkg.in/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.3.1 h1:WYFn/oANrAGP2C0dcV6/pbkPzv8yGzqTjPmTeO7qoXk=
+gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw=
+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/src-d/go-errors.v1 v1.0.0 h1:cooGdZnCjYbeS1zb1s6pVAAimTdKceRrpn7aKOnNIfc=
+gopkg.in/src-d/go-errors.v1 v1.0.0/go.mod h1:q1cBlomlw2FnDBDNGlnh6X0jPihy+QxZfMMNxPCbdYg=
+gopkg.in/telebot.v3 v3.2.1 h1:3I4LohaAyJBiivGmkfB+CiVu7QFOWkuZ4+KHgO/G3rs=
+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/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+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.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-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/api v0.32.0 h1:OL9JpbvAU5ny9ga2fb24X8H6xQlVp+aJMFlgtQjR9CE=
-k8s.io/api v0.32.0/go.mod h1:4LEwHZEf6Q/cG96F3dqR965sYOfmPM7rq81BLgsE0p0=
-k8s.io/api v0.32.1/go.mod h1:/Yi/BqkuueW1BgpoePYBRdDYfjPF5sgTr5+YqDZra5k=
-k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k=
-k8s.io/api v0.33.1/go.mod h1:87esjTn9DRSRTD4fWMXamiXxJhpOIREjWOSjsW1kEHw=
-k8s.io/api v0.33.2/go.mod h1:fhrbphQJSM2cXzCWgqU29xLDuks4mu7ti9vveEnpSXs=
-k8s.io/apiextensions-apiserver v0.32.0 h1:S0Xlqt51qzzqjKPxfgX1xh4HBZE+p8KKBq+k2SWNOE0=
-k8s.io/apiextensions-apiserver v0.32.0/go.mod h1:86hblMvN5yxMvZrZFX2OhIHAuFIMJIZ19bTvzkP+Fmw=
-k8s.io/apiextensions-apiserver v0.32.1/go.mod h1:sxWIGuGiYov7Io1fAS2X06NjMIk5CbRHc2StSmbaQto=
-k8s.io/apiextensions-apiserver v0.32.3/go.mod h1:8YwcvVRMVzw0r1Stc7XfGAzB/SIVLunqApySV5V7Dss=
-k8s.io/apiextensions-apiserver v0.33.1/go.mod h1:uNQ52z1A1Gu75QSa+pFK5bcXc4hq7lpOXbweZgi4dqA=
+gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
+honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
+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=
+k8s.io/api v0.33.3 h1:SRd5t//hhkI1buzxb288fy2xvjubstenEKL9K51KBI8=
+k8s.io/api v0.33.3/go.mod h1:01Y/iLUjNBM3TAvypct7DIj0M0NIZc+PzAHCIo0CYGE=
+k8s.io/apiextensions-apiserver v0.33.2 h1:6gnkIbngnaUflR3XwE1mCefN3YS8yTD631JXQhsU6M8=
k8s.io/apiextensions-apiserver v0.33.2/go.mod h1:IvVanieYsEHJImTKXGP6XCOjTwv2LUMos0YWc9O+QP8=
-k8s.io/apimachinery v0.32.0 h1:cFSE7N3rmEEtv4ei5X6DaJPHHX0C+upp+v5lVPiEwpg=
-k8s.io/apimachinery v0.32.0/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
-k8s.io/apimachinery v0.32.1/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
-k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
-k8s.io/apimachinery v0.33.1/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
-k8s.io/apimachinery v0.33.2/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
-k8s.io/client-go v0.32.0 h1:DimtMcnN/JIKZcrSrstiwvvZvLjG0aSxy8PxN8IChp8=
-k8s.io/client-go v0.32.0/go.mod h1:boDWvdM1Drk4NJj/VddSLnx59X3OPgwrOo0vGbtq9+8=
-k8s.io/client-go v0.32.1/go.mod h1:aTTKZY7MdxUaJ/KiUs8D+GssR9zJZi77ZqtzcGXIiDg=
-k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY=
-k8s.io/client-go v0.33.1/go.mod h1:JAsUrl1ArO7uRVFWfcj6kOomSlCv+JpvIsp6usAGefA=
-k8s.io/client-go v0.33.2/go.mod h1:9mCgT4wROvL948w6f6ArJNb7yQd7QsvqavDeZHvNmHo=
+k8s.io/apimachinery v0.33.3 h1:4ZSrmNa0c/ZpZJhAgRdcsFcZOw1PQU1bALVQ0B3I5LA=
+k8s.io/apimachinery v0.33.3/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
+k8s.io/apiserver v0.33.3 h1:Wv0hGc+QFdMJB4ZSiHrCgN3zL3QRatu56+rpccKC3J4=
+k8s.io/apiserver v0.33.3/go.mod h1:05632ifFEe6TxwjdAIrwINHWE2hLwyADFk5mBsQa15E=
+k8s.io/client-go v0.33.3 h1:M5AfDnKfYmVJif92ngN532gFqakcGi6RvaOF16efrpA=
+k8s.io/client-go v0.33.3/go.mod h1:luqKBQggEf3shbxHY4uVENAxrDISLOarxpTKMiUuujg=
+k8s.io/component-base v0.33.3 h1:mlAuyJqyPlKZM7FyaoM/LcunZaaY353RXiOd2+B5tGA=
+k8s.io/component-base v0.33.3/go.mod h1:ktBVsBzkI3imDuxYXmVxZ2zxJnYTZ4HAsVj9iF09qp4=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
-k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f h1:GA7//TjRY9yWGy1poLzYYJJ4JRdzg3+O6e8I+e+8T5Y=
-k8s.io/kube-openapi v0.0.0-20241105132330-32ad38e42d3f/go.mod h1:R/HEjbvWI0qdfb8viZUeVZm0X6IZnxAydC7YU42CMw4=
+k8s.io/kms v0.33.3 h1:7cQWC+GSH211NgY8LRKjBXNtkzra5SkpYzeZrOt5D+8=
+k8s.io/kms v0.33.3/go.mod h1:C1I8mjFFBNzfUZXYt9FZVJ8MJl7ynFbGgZFbBzkBJ3E=
+k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4=
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo=
+k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0=
+k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+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=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 h1:jpcvIRr3GLoUoEKRkHKSmGjxb6lWwrBlJsXc+eUYQHM=
+sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
-sigs.k8s.io/structured-merge-diff/v4 v4.5.0 h1:nbCitCK2hfnhyiKo6uf2HxUPTCodY6Qaf85SbDIaMBk=
-sigs.k8s.io/structured-merge-diff/v4 v4.5.0/go.mod h1:N8f93tFZh9U6vpxwRArLiikrE5/2tiu1w1AGfACIGE4=
+sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
+sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
+sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc=
sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
-sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
+sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
+sigs.k8s.io/yaml v1.5.0 h1:M10b2U7aEUY6hRtU870n2VTPgR5RZiL/I6Lcc2F4NUQ=
+sigs.k8s.io/yaml v1.5.0/go.mod h1:wZs27Rbxoai4C0f8/9urLZtZtF3avA3gKvGyPdDqTO4=
+xorm.io/builder v0.3.6 h1:ha28mQ2M+TFx96Hxo+iq6tQgnkC9IZkM6D8w9sKHHF8=
+xorm.io/builder v0.3.6/go.mod h1:LEFAPISnRzG+zxaxj2vPicRwz67BdhFreKg8yv8/TgU=
diff --git a/apps/advisor/kinds/check.cue b/apps/advisor/kinds/check.cue
index 2ce51faf910..01982443ffc 100644
--- a/apps/advisor/kinds/check.cue
+++ b/apps/advisor/kinds/check.cue
@@ -4,19 +4,17 @@ check: {
kind: "Check"
pluralName: "Checks"
current: "v0alpha1"
+ validation: {
+ operations: [
+ "CREATE",
+ "UPDATE",
+ ]
+ }
versions: {
"v0alpha1": {
codegen: {
- backend: true
- // Frontend code is generated following the instructions from
- // https://github.com/grafana/grafana/blob/main/public/app/api/README.md
- frontend: false
- }
- validation: {
- operations: [
- "CREATE",
- "UPDATE",
- ]
+ ts: {enabled: false}
+ go: {enabled: true}
}
schema: {
#Data: {
diff --git a/apps/advisor/kinds/checktype.cue b/apps/advisor/kinds/checktype.cue
index e2d653e629e..315d231754d 100644
--- a/apps/advisor/kinds/checktype.cue
+++ b/apps/advisor/kinds/checktype.cue
@@ -7,8 +7,8 @@ checktype: {
versions: {
"v0alpha1": {
codegen: {
- frontend: true
- backend: true
+ ts: {enabled: false}
+ go: {enabled: true}
}
schema: {
#Step: {
diff --git a/apps/advisor/pkg/apis/advisor_manifest.go b/apps/advisor/pkg/apis/advisor_manifest.go
index eb596a274e2..a85ff8b904f 100644
--- a/apps/advisor/pkg/apis/advisor_manifest.go
+++ b/apps/advisor/pkg/apis/advisor_manifest.go
@@ -8,6 +8,7 @@ package apis
import (
"encoding/json"
"fmt"
+ "strings"
"github.com/grafana/grafana-app-sdk/app"
"github.com/grafana/grafana-app-sdk/resource"
@@ -27,14 +28,16 @@ var (
var appManifestData = app.ManifestData{
AppName: "advisor",
Group: "advisor.grafana.app",
- Kinds: []app.ManifestKind{
+ Versions: []app.ManifestVersion{
{
- Kind: "Check",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
+ Name: "v0alpha1",
+ Served: true,
+ Kinds: []app.ManifestVersionKind{
{
- Name: "v0alpha1",
+ Kind: "Check",
+ Plural: "Checks",
+ Scope: "Namespaced",
+ Conversion: false,
Admission: &app.AdmissionCapabilities{
Validation: &app.ValidationCapability{
Operations: []app.AdmissionOperation{
@@ -45,17 +48,13 @@ var appManifestData = app.ManifestData{
},
Schema: &versionSchemaCheckv0alpha1,
},
- },
- },
- {
- Kind: "CheckType",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
{
- Name: "v0alpha1",
- Schema: &versionSchemaCheckTypev0alpha1,
+ Kind: "CheckType",
+ Plural: "CheckTypes",
+ Scope: "Namespaced",
+ Conversion: false,
+ Schema: &versionSchemaCheckTypev0alpha1,
},
},
},
@@ -81,3 +80,16 @@ func ManifestGoTypeAssociator(kind, version string) (goType resource.Kind, exist
goType, exists = kindVersionToGoType[fmt.Sprintf("%s/%s", kind, version)]
return goType, exists
}
+
+var customRouteToGoResponseType = map[string]any{}
+
+// ManifestCustomRouteResponsesAssociator returns the associated response go type for a given kind, version, custom route path, and method, if one exists.
+// kind may be empty for custom routes which are not kind subroutes. Leading slashes are removed from subroute paths.
+// If there is no association for the provided kind, version, custom route path, and method, exists will return false.
+func ManifestCustomRouteResponsesAssociator(kind, version, path, verb string) (goType any, exists bool) {
+ if len(path) > 0 && path[0] == '/' {
+ path = path[1:]
+ }
+ goType, exists = customRouteToGoResponseType[fmt.Sprintf("%s|%s|%s|%s", version, kind, path, strings.ToUpper(verb))]
+ return goType, exists
+}
diff --git a/apps/advisor/pkg/app/checkscheduler/checkscheduler.go b/apps/advisor/pkg/app/checkscheduler/checkscheduler.go
index 9e382c5315f..92fe70fe192 100644
--- a/apps/advisor/pkg/app/checkscheduler/checkscheduler.go
+++ b/apps/advisor/pkg/app/checkscheduler/checkscheduler.go
@@ -102,6 +102,12 @@ func (r *Runner) Run(ctx context.Context) error {
} else {
lastCreated = time.Now()
}
+ } else {
+ // Run an initial cleanup to remove old checks
+ err = r.cleanupChecks(ctxWithoutCancel, logger)
+ if err != nil {
+ logger.Error("Error cleaning up old check reports", "error", err)
+ }
}
}
@@ -132,17 +138,35 @@ func (r *Runner) Run(ctx context.Context) error {
}
}
+func (r *Runner) listChecks(ctx context.Context, logger logging.Logger) ([]resource.Object, error) {
+ list, err := r.client.List(ctx, r.namespace, resource.ListOptions{})
+ if err != nil {
+ return nil, err
+ }
+
+ checks := list.GetItems()
+ for list.GetContinue() != "" {
+ logger.Debug("List has continue token, listing next page", "continue", list.GetContinue())
+ list, err = r.client.List(ctx, r.namespace, resource.ListOptions{Continue: list.GetContinue()})
+ if err != nil {
+ return nil, err
+ }
+ checks = append(checks, list.GetItems()...)
+ }
+ return checks, nil
+}
+
// checkLastCreated returns the creation time of the last check created
// regardless of its ID. This assumes that the checks are created in batches
// so a batch will have a similar creation time.
// In case it finds an unprocessed check from a previous run, it will set it to error.
func (r *Runner) checkLastCreated(ctx context.Context, log logging.Logger) (time.Time, error) {
- list, err := r.client.List(ctx, r.namespace, resource.ListOptions{})
+ checkList, err := r.listChecks(ctx, log)
if err != nil {
return time.Time{}, err
}
lastCreated := time.Time{}
- for _, item := range list.GetItems() {
+ for _, item := range checkList {
itemCreated := item.GetCreationTimestamp().Time
if itemCreated.After(lastCreated) {
lastCreated = itemCreated
@@ -209,14 +233,16 @@ func (r *Runner) createChecks(ctx context.Context, logger logging.Logger) error
// cleanupChecks deletes the olders checks if the number of checks exceeds the limit.
func (r *Runner) cleanupChecks(ctx context.Context, logger logging.Logger) error {
- list, err := r.client.List(ctx, r.namespace, resource.ListOptions{Limit: -1})
+ checkList, err := r.listChecks(ctx, logger)
if err != nil {
return err
}
+ logger.Debug("Cleaning up checks", "numChecks", len(checkList))
+
// organize checks by type
checksByType := map[string][]resource.Object{}
- for _, check := range list.GetItems() {
+ for _, check := range checkList {
labels := check.GetLabels()
checkType, ok := labels[checks.TypeLabel]
if !ok {
@@ -226,8 +252,10 @@ func (r *Runner) cleanupChecks(ctx context.Context, logger logging.Logger) error
checksByType[checkType] = append(checksByType[checkType], check)
}
- for _, checks := range checksByType {
+ for checkType, checks := range checksByType {
+ logger.Debug("Checking checks", "checkType", checkType, "numChecks", len(checks))
if len(checks) > r.maxHistory {
+ logger.Debug("Deleting old checks", "checkType", checkType, "maxHistory", r.maxHistory, "numChecks", len(checks))
// Sort checks by creation time
sort.Slice(checks, func(i, j int) bool {
ti := checks[i].GetCreationTimestamp().Time
@@ -242,6 +270,7 @@ func (r *Runner) cleanupChecks(ctx context.Context, logger logging.Logger) error
if err != nil {
return fmt.Errorf("error deleting check: %w", err)
}
+ logger.Debug("Deleted check", "check", check.GetStaticMetadata().Identifier())
}
}
}
diff --git a/apps/advisor/pkg/app/checkscheduler/checkscheduler_test.go b/apps/advisor/pkg/app/checkscheduler/checkscheduler_test.go
index 69b4e809b4c..de522be7adc 100644
--- a/apps/advisor/pkg/app/checkscheduler/checkscheduler_test.go
+++ b/apps/advisor/pkg/app/checkscheduler/checkscheduler_test.go
@@ -103,6 +103,69 @@ func TestRunner_checkLastCreated_UnprocessedCheck(t *testing.T) {
assert.Equal(t, expectedAnnotations, patchOperation.Value)
}
+func TestRunner_checkLastCreated_PaginatedResponse(t *testing.T) {
+ // Create checks with different creation times
+ past := time.Now().Add(-1 * time.Hour)
+ now := time.Now()
+
+ mockClient := &MockClient{
+ listFunc: func(ctx context.Context, namespace string, options resource.ListOptions) (resource.ListObject, error) {
+ if options.Continue == "" {
+ // First page - return oldest and middle checks with continue token
+ return &advisorv0alpha1.CheckList{
+ ListMeta: metav1.ListMeta{
+ Continue: "continue-token-123",
+ },
+ Items: []advisorv0alpha1.Check{
+ {
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "check-1",
+ CreationTimestamp: metav1.NewTime(past),
+ Annotations: map[string]string{
+ checks.StatusAnnotation: "completed",
+ },
+ },
+ },
+ {
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "check-2",
+ CreationTimestamp: metav1.NewTime(past),
+ Annotations: map[string]string{
+ checks.StatusAnnotation: "completed",
+ },
+ },
+ },
+ },
+ }, nil
+ }
+ // Second page - verify continue token is passed and return newest check
+ assert.Equal(t, "continue-token-123", options.Continue)
+ return &advisorv0alpha1.CheckList{
+ Items: []advisorv0alpha1.Check{
+ {
+ ObjectMeta: metav1.ObjectMeta{
+ Name: "check-3",
+ CreationTimestamp: metav1.NewTime(now),
+ Annotations: map[string]string{
+ checks.StatusAnnotation: "completed",
+ },
+ },
+ },
+ },
+ }, nil
+ },
+ }
+
+ runner := &Runner{
+ client: mockClient,
+ log: &logging.NoOpLogger{},
+ }
+
+ lastCreated, err := runner.checkLastCreated(context.Background(), &logging.NoOpLogger{})
+ assert.NoError(t, err)
+ assert.Equal(t, now.Truncate(time.Second), lastCreated.Truncate(time.Second))
+}
+
func TestRunner_createChecks_ErrorOnCreate(t *testing.T) {
mockCheckService := &MockCheckService{checks: []checks.Check{&mockCheck{id: "check-1"}}}
diff --git a/apps/advisor/pkg/app/utils.go b/apps/advisor/pkg/app/utils.go
index cf090b67260..80f71cc679e 100644
--- a/apps/advisor/pkg/app/utils.go
+++ b/apps/advisor/pkg/app/utils.go
@@ -12,6 +12,7 @@ import (
"github.com/grafana/grafana-app-sdk/resource"
advisorv0alpha1 "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1"
"github.com/grafana/grafana/apps/advisor/pkg/app/checks"
+ "github.com/grafana/grafana/pkg/services/contexthandler"
)
func getCheck(obj resource.Object, checkMap map[string]checks.Check) (checks.Check, error) {
@@ -170,6 +171,7 @@ func processCheckRetry(ctx context.Context, log logging.Logger, client resource.
}
// Delete the retry annotation to mark the check as processed
annotations := checks.DeleteAnnotations(ctx, obj, []string{checks.RetryAnnotation})
+
return checks.SetAnnotations(ctx, client, obj, annotations)
}
@@ -197,7 +199,10 @@ func runStepsInParallel(ctx context.Context, log logging.Logger, spec *advisorv0
}
}()
logger := log.With("step", step.ID())
- stepErr, err = step.Run(ctx, logger, spec, item)
+ // Create a copy of the context with a cloned HTTP request to prevent
+ // concurrent modifications to the same header map
+ safeCtx := contexthandler.CopyWithReqContext(ctx)
+ stepErr, err = step.Run(safeCtx, logger, spec, item)
}()
mu.Lock()
defer mu.Unlock()
diff --git a/apps/advisor/pkg/app/utils_test.go b/apps/advisor/pkg/app/utils_test.go
index df4b016db93..663d7cfdcf6 100644
--- a/apps/advisor/pkg/app/utils_test.go
+++ b/apps/advisor/pkg/app/utils_test.go
@@ -4,6 +4,7 @@ import (
"context"
"errors"
"fmt"
+ "net/http"
"testing"
"github.com/grafana/grafana-app-sdk/logging"
@@ -11,7 +12,13 @@ import (
advisorv0alpha1 "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1"
"github.com/grafana/grafana/apps/advisor/pkg/app/checks"
"github.com/grafana/grafana/pkg/apimachinery/utils"
+ "github.com/grafana/grafana/pkg/services/contexthandler"
+ "github.com/grafana/grafana/pkg/services/contexthandler/ctxkey"
+ contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model"
+ "github.com/grafana/grafana/pkg/services/user"
+ "github.com/grafana/grafana/pkg/web"
"github.com/stretchr/testify/assert"
+ "github.com/stretchr/testify/require"
)
func TestGetCheck(t *testing.T) {
@@ -289,13 +296,75 @@ func TestProcessCheckRetry_Success(t *testing.T) {
assert.Empty(t, obj.Status.Report.Failures)
}
+func TestRunStepsInParallel_ConcurrentHeaderAccess(t *testing.T) {
+ // Create an HTTP request with headers to simulate the real scenario
+ req, err := http.NewRequest("GET", "/test", nil)
+ require.NoError(t, err)
+ req.Header.Set("X-Test-Header", "test-value")
+ req.Header.Set("X-Panel-Id", "123")
+ req.Header.Set("Cookie", "session=abc123; user_pref=dark")
+
+ // Create a context with ReqContext that includes the HTTP request
+ webCtx := &web.Context{
+ Req: req,
+ }
+ reqCtx := &contextmodel.ReqContext{
+ Context: webCtx,
+ SignedInUser: &user.SignedInUser{},
+ }
+
+ ctx := ctxkey.Set(context.Background(), reqCtx)
+
+ // Create steps that modify headers concurrently (simulating CookiesMiddleware behavior)
+ steps := []checks.Step{
+ &headerModifyingStep{headerName: "X-Test-Header", headerValue: "modified-1"},
+ &headerModifyingStep{headerName: "Cookie", headerValue: "session=xyz456"},
+ &headerModifyingStep{headerName: "X-Panel-Id", headerValue: "456"},
+ }
+
+ // Create multiple items to process
+ const numItems = 20
+ items := make([]any, numItems)
+ for i := 0; i < numItems; i++ {
+ items[i] = fmt.Sprintf("item-%d", i)
+ }
+
+ // Track panics that might occur during execution
+ var panicCount int32
+ originalPanicHandler := func() {
+ if r := recover(); r != nil {
+ panicCount++
+ t.Errorf("Unexpected panic during concurrent header access: %v", r)
+ }
+ }
+
+ // This test should not panic with our fix
+ t.Run("should not panic with concurrent header modifications", func(t *testing.T) {
+ defer func() {
+ if r := recover(); r != nil {
+ originalPanicHandler()
+ }
+ }()
+
+ failures, err := runStepsInParallel(ctx, logging.DefaultLogger, nil, steps, items)
+
+ // Verify no error occurred
+ assert.NoError(t, err)
+ // Should have no failures since our mock step doesn't report failures
+ assert.Empty(t, failures)
+ // Verify no panics occurred
+ assert.Equal(t, int32(0), panicCount)
+ })
+}
+
type mockClient struct {
resource.Client
values []any
}
func (m *mockClient) PatchInto(ctx context.Context, id resource.Identifier, req resource.PatchRequest, opts resource.PatchOptions, obj resource.Object) error {
- m.values = append(m.values, req.Operations[0].Value)
+ value := req.Operations[0].Value
+ m.values = append(m.values, value)
return nil
}
@@ -376,3 +445,49 @@ func (m *mockStep) Resolution() string {
func (m *mockStep) ID() string {
return "mock"
}
+
+// headerModifyingStep is a mock step that modifies HTTP headers to simulate
+// the behavior of CookiesMiddleware and other middleware that caused the original panic
+type headerModifyingStep struct {
+ headerName string
+ headerValue string
+}
+
+func (h *headerModifyingStep) Run(ctx context.Context, log logging.Logger, obj *advisorv0alpha1.CheckSpec, item any) ([]advisorv0alpha1.CheckReportFailure, error) {
+ // Get the request context and modify headers (this used to cause panics)
+ reqCtx := contexthandler.FromContext(ctx)
+ if reqCtx != nil && reqCtx.Req != nil {
+ // This is the type of header modification that was causing the concurrent map access panic
+ reqCtx.Req.Header.Set(h.headerName, h.headerValue)
+ reqCtx.Req.Header.Add("X-Processed-By", h.ID())
+
+ // Also test header deletion like ClearCookieHeader does
+ if h.headerName == "Cookie" {
+ reqCtx.Req.Header.Del("Cookie")
+ reqCtx.Req.Header.Set("Cookie", h.headerValue)
+ }
+
+ // Test reading headers as well
+ _ = reqCtx.Req.Header.Get("X-Test-Header")
+ _ = reqCtx.Req.Header.Get("X-Panel-Id")
+ }
+
+ // No failures to report
+ return nil, nil
+}
+
+func (h *headerModifyingStep) Title() string {
+ return "Header Modifying Step"
+}
+
+func (h *headerModifyingStep) Description() string {
+ return "A mock step that modifies HTTP headers to test concurrent access"
+}
+
+func (h *headerModifyingStep) Resolution() string {
+ return "This is a test step"
+}
+
+func (h *headerModifyingStep) ID() string {
+ return fmt.Sprintf("header-modifier-%s", h.headerName)
+}
diff --git a/apps/alerting/notifications/Makefile b/apps/alerting/notifications/Makefile
index d745632abf9..817a6d508ff 100644
--- a/apps/alerting/notifications/Makefile
+++ b/apps/alerting/notifications/Makefile
@@ -1,22 +1,4 @@
-APP_SDK_VERSION := v0.39.0
-APP_SDK_DIR := $(shell go env GOPATH)/bin/app-sdk-$(APP_SDK_VERSION)
-APP_SDK_BIN := $(APP_SDK_DIR)/grafana-app-sdk
-
-.PHONY: install-app-sdk
-install-app-sdk: $(APP_SDK_BIN) ## Install the Grafana App SDK
-
-$(APP_SDK_BIN):
- @echo "Installing Grafana App SDK version $(APP_SDK_VERSION)"
- @mkdir -p $(APP_SDK_DIR)
- # The only way to install specific versions of binaries using `go install`
- # is by setting GOBIN to the directory you want to install the binary to.
- GOBIN=$(APP_SDK_DIR) go install github.com/grafana/grafana-app-sdk/cmd/grafana-app-sdk@$(APP_SDK_VERSION)
- @touch $@
-
-.PHONY: update-app-sdk
-update-app-sdk: ## Update the Grafana App SDK dependency in go.mod
- go get github.com/grafana/grafana-app-sdk@$(APP_SDK_VERSION)
- go mod tidy
+include ../../sdk.mk
.PHONY: generate
generate: do-generate ## Run Grafana App SDK code generation
@@ -24,4 +6,4 @@ generate: do-generate ## Run Grafana App SDK code generation
.PHONY: do-generate
do-generate: install-app-sdk update-app-sdk
## --defencoding=none and noschemasinmanifest are needed to avoid infinite loop while generating recursive models (see routingtree.cue)
- @$(APP_SDK_BIN) generate --grouping=group --gogenpath=./pkg/apis --defencoding=none --postprocess --noschemasinmanifest
+ @$(APP_SDK_BIN) generate --grouping=group --gogenpath=./pkg/apis --defencoding=none --postprocess --noschemasinmanifest --useoldmanifestkinds
diff --git a/apps/alerting/notifications/go.mod b/apps/alerting/notifications/go.mod
index f9ea5babd51..b885b4d1eb4 100644
--- a/apps/alerting/notifications/go.mod
+++ b/apps/alerting/notifications/go.mod
@@ -1,12 +1,12 @@
module github.com/grafana/grafana/apps/alerting/notifications
-go 1.24.4
+go 1.24.5
require (
- github.com/grafana/grafana-app-sdk v0.39.2
- github.com/grafana/grafana-app-sdk/logging v0.39.1
- k8s.io/apimachinery v0.33.2
- k8s.io/apiserver v0.33.2
+ github.com/grafana/grafana-app-sdk v0.40.0
+ github.com/grafana/grafana-app-sdk/logging v0.39.3
+ k8s.io/apimachinery v0.33.3
+ k8s.io/apiserver v0.33.3
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff
)
@@ -19,12 +19,12 @@ require (
github.com/coreos/go-semver v0.3.1 // indirect
github.com/coreos/go-systemd/v22 v22.5.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
- github.com/emicklei/go-restful/v3 v3.11.0 // indirect
+ github.com/emicklei/go-restful/v3 v3.12.1 // indirect
github.com/evanphx/json-patch v5.9.11+incompatible // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/getkin/kin-openapi v0.132.0 // indirect
- github.com/go-logr/logr v1.4.2 // indirect
+ github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
@@ -38,14 +38,14 @@ require (
github.com/google/uuid v1.6.0 // indirect
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340 // indirect
- github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/jonboulle/clockwork v0.5.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/kylelemons/godebug v1.1.0 // indirect
- github.com/mailru/easyjson v0.7.7 // indirect
+ github.com/mailru/easyjson v0.9.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
@@ -58,7 +58,7 @@ require (
github.com/pkg/errors v0.9.1 // indirect
github.com/prometheus/client_golang v1.22.0 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
- github.com/prometheus/common v0.64.0 // indirect
+ github.com/prometheus/common v0.65.0 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/puzpuzpuz/xsync/v2 v2.5.1 // indirect
github.com/rogpeppe/go-internal v1.14.1 // indirect
@@ -70,20 +70,21 @@ require (
go.etcd.io/etcd/client/v3 v3.5.21 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect
- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect
- go.opentelemetry.io/otel v1.36.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.36.0 // indirect
- go.opentelemetry.io/otel/metric v1.36.0 // indirect
- go.opentelemetry.io/otel/sdk v1.36.0 // indirect
- go.opentelemetry.io/otel/trace v1.36.0 // indirect
- go.opentelemetry.io/proto/otlp v1.6.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect
+ go.opentelemetry.io/otel v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0 // indirect
+ go.opentelemetry.io/otel/metric v1.37.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.37.0 // indirect
+ go.opentelemetry.io/otel/trace v1.37.0 // indirect
+ go.opentelemetry.io/proto/otlp v1.7.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
+ go.yaml.in/yaml/v2 v2.4.2 // indirect
golang.org/x/net v0.41.0 // indirect
golang.org/x/oauth2 v0.30.0 // indirect
- golang.org/x/sync v0.15.0 // indirect
+ golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.33.0 // indirect
golang.org/x/term v0.32.0 // indirect
golang.org/x/text v0.26.0 // indirect
@@ -97,15 +98,15 @@ require (
gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
- k8s.io/api v0.33.2 // indirect
+ k8s.io/api v0.33.3 // indirect
k8s.io/apiextensions-apiserver v0.33.2 // indirect
- k8s.io/client-go v0.33.2 // indirect
- k8s.io/component-base v0.33.2 // indirect
+ k8s.io/client-go v0.33.3 // indirect
+ k8s.io/component-base v0.33.3 // indirect
k8s.io/klog/v2 v2.130.1 // indirect
- k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
+ k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 // indirect
- sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
+ sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect
- sigs.k8s.io/yaml v1.4.0 // indirect
+ sigs.k8s.io/yaml v1.5.0 // indirect
)
diff --git a/apps/alerting/notifications/go.sum b/apps/alerting/notifications/go.sum
index c906b01a1af..c5caf4fb4e0 100644
--- a/apps/alerting/notifications/go.sum
+++ b/apps/alerting/notifications/go.sum
@@ -25,8 +25,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
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/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
-github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU=
+github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
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=
@@ -42,8 +42,8 @@ github.com/getkin/kin-openapi v0.132.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaE
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
-github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
+github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
@@ -84,18 +84,18 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo=
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA=
-github.com/grafana/grafana-app-sdk v0.39.2 h1:ymfr+1318t+JC9U2OYrzVpGmNG/aJONUmFFu/G98Xh8=
-github.com/grafana/grafana-app-sdk v0.39.2/go.mod h1:t0m6q561lpoHQCixS9LUHFUhUzDClzNtm7BH60gHVSY=
-github.com/grafana/grafana-app-sdk/logging v0.39.1 h1:lI5rbrheuwVPuyIM6LIuEYOCSpgmXahfKtqeMyhbGPU=
-github.com/grafana/grafana-app-sdk/logging v0.39.1/go.mod h1:WhDENSnaGHtyVVwZGVnAR7YLvh2xlLDYR3D7E6h7XVk=
+github.com/grafana/grafana-app-sdk v0.40.0 h1:KilbCFMYox2cnIi1W6ql7W+n9kms/NvWlBPM1m4Q4mg=
+github.com/grafana/grafana-app-sdk v0.40.0/go.mod h1:fn943JEM0CR3mY/Gd3816MUcpob5xnKc8MoojnbMjYY=
+github.com/grafana/grafana-app-sdk/logging v0.39.3 h1:mMrcYahnoRu7blKyL/ZVcgv7WCiI2CqxODYh8tBFUgY=
+github.com/grafana/grafana-app-sdk/logging v0.39.3/go.mod h1:otUD9XpJD7A5sCLb8mcs9hIXGdeV6lnhzVwe747g4RU=
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI=
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8=
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.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -121,8 +121,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
-github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
-github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=
+github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
@@ -159,8 +159,8 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
-github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
-github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
+github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE=
+github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
@@ -215,26 +215,26 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw=
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q=
-go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg=
-go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0 h1:dNzwXjZKpMpE2JhmO+9HsPl42NIXFIFSUSSs0fiqra0=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0/go.mod h1:90PoxvaEB5n6AOdZvi+yWJQoE95U8Dhhw2bSyRqnTD0=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0 h1:JgtbA0xkWHnTmYk7YusopJFX6uleBmAuZ8n05NEh8nQ=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0/go.mod h1:179AK5aar5R3eS9FucPy6rggvU0g52cvKId8pv4+v0c=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.36.0 h1:nRVXXvf78e00EwY6Wp0YII8ww2JVWshZ20HfTlE11AM=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.36.0/go.mod h1:r49hO7CgrxY9Voaj3Xe8pANWtr0Oq916d0XAmOoCZAQ=
-go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE=
-go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs=
-go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs=
-go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY=
-go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis=
-go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4=
-go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w=
-go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
-go.opentelemetry.io/proto/otlp v1.6.0 h1:jQjP+AQyTf+Fe7OKj/MfkDrmK4MNVtw2NpXsf9fefDI=
-go.opentelemetry.io/proto/otlp v1.6.0/go.mod h1:cicgGehlFuNdgZkcALOCh3VE6K/u2tAjzlRhDwmVpZc=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY=
+go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
+go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0 h1:bDMKF3RUSxshZ5OjOTi8rsHGaPKsAt76FaqgvIUySLc=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0/go.mod h1:dDT67G/IkA46Mr2l9Uj7HsQVwsjASyV9SjGofsiUZDA=
+go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
+go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
+go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
+go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
+go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
+go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
+go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
+go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
+go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os=
+go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
@@ -245,6 +245,10 @@ go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN8
go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
+go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
+go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
+go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE=
+go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -276,8 +280,8 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
-golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
+golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -352,32 +356,33 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
-k8s.io/api v0.33.2 h1:YgwIS5jKfA+BZg//OQhkJNIfie/kmRsO0BmNaVSimvY=
-k8s.io/api v0.33.2/go.mod h1:fhrbphQJSM2cXzCWgqU29xLDuks4mu7ti9vveEnpSXs=
+k8s.io/api v0.33.3 h1:SRd5t//hhkI1buzxb288fy2xvjubstenEKL9K51KBI8=
+k8s.io/api v0.33.3/go.mod h1:01Y/iLUjNBM3TAvypct7DIj0M0NIZc+PzAHCIo0CYGE=
k8s.io/apiextensions-apiserver v0.33.2 h1:6gnkIbngnaUflR3XwE1mCefN3YS8yTD631JXQhsU6M8=
k8s.io/apiextensions-apiserver v0.33.2/go.mod h1:IvVanieYsEHJImTKXGP6XCOjTwv2LUMos0YWc9O+QP8=
-k8s.io/apimachinery v0.33.2 h1:IHFVhqg59mb8PJWTLi8m1mAoepkUNYmptHsV+Z1m5jY=
-k8s.io/apimachinery v0.33.2/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
-k8s.io/apiserver v0.33.2 h1:KGTRbxn2wJagJowo29kKBp4TchpO1DRO3g+dB/KOJN4=
-k8s.io/apiserver v0.33.2/go.mod h1:9qday04wEAMLPWWo9AwqCZSiIn3OYSZacDyu/AcoM/M=
-k8s.io/client-go v0.33.2 h1:z8CIcc0P581x/J1ZYf4CNzRKxRvQAwoAolYPbtQes+E=
-k8s.io/client-go v0.33.2/go.mod h1:9mCgT4wROvL948w6f6ArJNb7yQd7QsvqavDeZHvNmHo=
-k8s.io/component-base v0.33.2 h1:sCCsn9s/dG3ZrQTX/Us0/Sx2R0G5kwa0wbZFYoVp/+0=
-k8s.io/component-base v0.33.2/go.mod h1:/41uw9wKzuelhN+u+/C59ixxf4tYQKW7p32ddkYNe2k=
+k8s.io/apimachinery v0.33.3 h1:4ZSrmNa0c/ZpZJhAgRdcsFcZOw1PQU1bALVQ0B3I5LA=
+k8s.io/apimachinery v0.33.3/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
+k8s.io/apiserver v0.33.3 h1:Wv0hGc+QFdMJB4ZSiHrCgN3zL3QRatu56+rpccKC3J4=
+k8s.io/apiserver v0.33.3/go.mod h1:05632ifFEe6TxwjdAIrwINHWE2hLwyADFk5mBsQa15E=
+k8s.io/client-go v0.33.3 h1:M5AfDnKfYmVJif92ngN532gFqakcGi6RvaOF16efrpA=
+k8s.io/client-go v0.33.3/go.mod h1:luqKBQggEf3shbxHY4uVENAxrDISLOarxpTKMiUuujg=
+k8s.io/component-base v0.33.3 h1:mlAuyJqyPlKZM7FyaoM/LcunZaaY353RXiOd2+B5tGA=
+k8s.io/component-base v0.33.3/go.mod h1:ktBVsBzkI3imDuxYXmVxZ2zxJnYTZ4HAsVj9iF09qp4=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4=
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0=
+k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 h1:jpcvIRr3GLoUoEKRkHKSmGjxb6lWwrBlJsXc+eUYQHM=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc=
sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
-sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
+sigs.k8s.io/yaml v1.5.0 h1:M10b2U7aEUY6hRtU870n2VTPgR5RZiL/I6Lcc2F4NUQ=
+sigs.k8s.io/yaml v1.5.0/go.mod h1:wZs27Rbxoai4C0f8/9urLZtZtF3avA3gKvGyPdDqTO4=
diff --git a/apps/alerting/notifications/kinds/receiver.cue b/apps/alerting/notifications/kinds/receiver.cue
index 9342f60298b..bf0dba84987 100644
--- a/apps/alerting/notifications/kinds/receiver.cue
+++ b/apps/alerting/notifications/kinds/receiver.cue
@@ -11,12 +11,12 @@ receiver: {
}
pluralName: "Receivers"
current: "v0alpha1"
- codegen: {
- ts: {enabled: false}
- go: {enabled: true}
- }
versions: {
"v0alpha1": {
+ codegen: {
+ ts: {enabled: false}
+ go: {enabled: true}
+ }
schema: {
spec: v0alpha1.ReceiverSpec
}
diff --git a/apps/alerting/notifications/kinds/routingtree.cue b/apps/alerting/notifications/kinds/routingtree.cue
index cff9f8cd243..8fd527ff6f0 100644
--- a/apps/alerting/notifications/kinds/routingtree.cue
+++ b/apps/alerting/notifications/kinds/routingtree.cue
@@ -11,12 +11,12 @@ routeTree: {
}
pluralName: "RoutingTrees"
current: "v0alpha1"
- codegen: {
- ts: {enabled: false}
- go: {enabled: true}
- }
versions: {
"v0alpha1": {
+ codegen: {
+ ts: {enabled: false}
+ go: {enabled: true}
+ }
schema: {
spec: v0alpha1.RouteTreeSpec
}
diff --git a/apps/alerting/notifications/kinds/template.cue b/apps/alerting/notifications/kinds/template.cue
index 0914b643c76..9eae7fadf1d 100644
--- a/apps/alerting/notifications/kinds/template.cue
+++ b/apps/alerting/notifications/kinds/template.cue
@@ -11,12 +11,12 @@ templateGroup: {
}
pluralName: "TemplateGroups"
current: "v0alpha1"
- codegen: {
- ts: {enabled: false}
- go: {enabled: true}
- }
versions: {
"v0alpha1": {
+ codegen: {
+ ts: {enabled: false}
+ go: {enabled: true}
+ }
schema: {
spec: v0alpha1.TemplateGroupSpec
}
diff --git a/apps/alerting/notifications/kinds/timeInterval.cue b/apps/alerting/notifications/kinds/timeInterval.cue
index 2ba052895bc..4b5004ff0e5 100644
--- a/apps/alerting/notifications/kinds/timeInterval.cue
+++ b/apps/alerting/notifications/kinds/timeInterval.cue
@@ -11,12 +11,12 @@ timeInterval: {
}
pluralName: "TimeIntervals"
current: "v0alpha1"
- codegen: {
- ts: {enabled: false}
- go: {enabled: true}
- }
versions: {
"v0alpha1": {
+ codegen: {
+ ts: {enabled: false}
+ go: {enabled: true}
+ }
schema: {
spec: v0alpha1.TimeIntervalSpec
}
diff --git a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/receiver_schema_gen.go b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/receiver_schema_gen.go
index 314d36b602a..acda5c7d1c9 100644
--- a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/receiver_schema_gen.go
+++ b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/receiver_schema_gen.go
@@ -13,7 +13,7 @@ import (
// schema is unexported to prevent accidental overwrites
var (
schemaReceiver = resource.NewSimpleSchema("notifications.alerting.grafana.app", "v0alpha1", &Receiver{}, &ReceiverList{}, resource.WithKind("Receiver"),
- resource.WithPlural("receivers"), resource.WithScope(resource.NamespacedScope), resource.WithSelectableFields([]resource.SelectableField{{
+ resource.WithPlural("receivers"), resource.WithScope(resource.NamespacedScope), resource.WithSelectableFields([]resource.SelectableField{resource.SelectableField{
FieldSelector: "spec.title",
FieldValueFunc: func(o resource.Object) (string, error) {
cast, ok := o.(*Receiver)
diff --git a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/templategroup_schema_gen.go b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/templategroup_schema_gen.go
index 509bfc4aeca..339d0bd6d04 100644
--- a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/templategroup_schema_gen.go
+++ b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/templategroup_schema_gen.go
@@ -13,7 +13,7 @@ import (
// schema is unexported to prevent accidental overwrites
var (
schemaTemplateGroup = resource.NewSimpleSchema("notifications.alerting.grafana.app", "v0alpha1", &TemplateGroup{}, &TemplateGroupList{}, resource.WithKind("TemplateGroup"),
- resource.WithPlural("templategroups"), resource.WithScope(resource.NamespacedScope), resource.WithSelectableFields([]resource.SelectableField{{
+ resource.WithPlural("templategroups"), resource.WithScope(resource.NamespacedScope), resource.WithSelectableFields([]resource.SelectableField{resource.SelectableField{
FieldSelector: "spec.title",
FieldValueFunc: func(o resource.Object) (string, error) {
cast, ok := o.(*TemplateGroup)
diff --git a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/timeinterval_schema_gen.go b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/timeinterval_schema_gen.go
index 8c5459f0059..a6c809e0d3b 100644
--- a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/timeinterval_schema_gen.go
+++ b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/timeinterval_schema_gen.go
@@ -13,7 +13,7 @@ import (
// schema is unexported to prevent accidental overwrites
var (
schemaTimeInterval = resource.NewSimpleSchema("notifications.alerting.grafana.app", "v0alpha1", &TimeInterval{}, &TimeIntervalList{}, resource.WithKind("TimeInterval"),
- resource.WithPlural("timeintervals"), resource.WithScope(resource.NamespacedScope), resource.WithSelectableFields([]resource.SelectableField{{
+ resource.WithPlural("timeintervals"), resource.WithScope(resource.NamespacedScope), resource.WithSelectableFields([]resource.SelectableField{resource.SelectableField{
FieldSelector: "spec.name",
FieldValueFunc: func(o resource.Object) (string, error) {
cast, ok := o.(*TimeInterval)
diff --git a/apps/alerting/notifications/pkg/apis/alerting_manifest.go b/apps/alerting/notifications/pkg/apis/alerting_manifest.go
index 9b1e424d463..40f05004004 100644
--- a/apps/alerting/notifications/pkg/apis/alerting_manifest.go
+++ b/apps/alerting/notifications/pkg/apis/alerting_manifest.go
@@ -7,6 +7,7 @@ package apis
import (
"fmt"
+ "strings"
"github.com/grafana/grafana-app-sdk/app"
"github.com/grafana/grafana-app-sdk/resource"
@@ -14,56 +15,48 @@ import (
v0alpha1 "github.com/grafana/grafana/apps/alerting/notifications/pkg/apis/alerting/v0alpha1"
)
+var ()
+
var appManifestData = app.ManifestData{
AppName: "alerting",
Group: "notifications.alerting.grafana.app",
- Kinds: []app.ManifestKind{
+ Versions: []app.ManifestVersion{
{
- Kind: "Receiver",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
+ Name: "v0alpha1",
+ Served: true,
+ Kinds: []app.ManifestVersionKind{
{
- Name: "v0alpha1",
+ Kind: "Receiver",
+ Plural: "Receivers",
+ Scope: "Namespaced",
+ Conversion: false,
SelectableFields: []string{
"spec.title",
},
},
- },
- },
- {
- Kind: "RoutingTree",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
{
- Name: "v0alpha1",
+ Kind: "RoutingTree",
+ Plural: "RoutingTrees",
+ Scope: "Namespaced",
+ Conversion: false,
},
- },
- },
- {
- Kind: "TemplateGroup",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
{
- Name: "v0alpha1",
+ Kind: "TemplateGroup",
+ Plural: "TemplateGroups",
+ Scope: "Namespaced",
+ Conversion: false,
SelectableFields: []string{
"spec.title",
},
},
- },
- },
- {
- Kind: "TimeInterval",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
{
- Name: "v0alpha1",
+ Kind: "TimeInterval",
+ Plural: "TimeIntervals",
+ Scope: "Namespaced",
+ Conversion: false,
SelectableFields: []string{
"spec.name",
},
@@ -94,3 +87,16 @@ func ManifestGoTypeAssociator(kind, version string) (goType resource.Kind, exist
goType, exists = kindVersionToGoType[fmt.Sprintf("%s/%s", kind, version)]
return goType, exists
}
+
+var customRouteToGoResponseType = map[string]any{}
+
+// ManifestCustomRouteResponsesAssociator returns the associated response go type for a given kind, version, custom route path, and method, if one exists.
+// kind may be empty for custom routes which are not kind subroutes. Leading slashes are removed from subroute paths.
+// If there is no association for the provided kind, version, custom route path, and method, exists will return false.
+func ManifestCustomRouteResponsesAssociator(kind, version, path, verb string) (goType any, exists bool) {
+ if len(path) > 0 && path[0] == '/' {
+ path = path[1:]
+ }
+ goType, exists = customRouteToGoResponseType[fmt.Sprintf("%s|%s|%s|%s", version, kind, path, strings.ToUpper(verb))]
+ return goType, exists
+}
diff --git a/apps/dashboard/Makefile b/apps/dashboard/Makefile
index 950c809c0ec..c3905410aed 100644
--- a/apps/dashboard/Makefile
+++ b/apps/dashboard/Makefile
@@ -1,22 +1,4 @@
-APP_SDK_VERSION := v0.39.2
-APP_SDK_DIR := $(shell go env GOPATH)/bin/app-sdk-$(APP_SDK_VERSION)
-APP_SDK_BIN := $(APP_SDK_DIR)/grafana-app-sdk
-
-.PHONY: install-app-sdk
-install-app-sdk: $(APP_SDK_BIN) ## Install the Grafana App SDK
-
-$(APP_SDK_BIN):
- @echo "Installing Grafana App SDK version $(APP_SDK_VERSION)"
- @mkdir -p $(APP_SDK_DIR)
- # The only way to install specific versions of binaries using `go install`
- # is by setting GOBIN to the directory you want to install the binary to.
- GOBIN=$(APP_SDK_DIR) go install github.com/grafana/grafana-app-sdk/cmd/grafana-app-sdk@$(APP_SDK_VERSION)
- @touch $@
-
-.PHONY: update-app-sdk
-update-app-sdk: ## Update the Grafana App SDK dependency in go.mod
- go get github.com/grafana/grafana-app-sdk@$(APP_SDK_VERSION)
- go mod tidy
+include ../sdk.mk
.PHONY: generate
generate: do-generate post-generate-cleanup ## Run Grafana App SDK code generation
@@ -30,7 +12,8 @@ do-generate: install-app-sdk update-app-sdk ## Run Grafana App SDK code generati
--grouping=group \
--defencoding=none \
--genoperatorstate=false \
- --noschemasinmanifest
+ --noschemasinmanifest \
+ --useoldmanifestkinds
.PHONY: post-generate-cleanup
post-generate-cleanup: ## Clean up the generated code
diff --git a/apps/dashboard/go.mod b/apps/dashboard/go.mod
index 837887e08e1..dc97db7ddc0 100644
--- a/apps/dashboard/go.mod
+++ b/apps/dashboard/go.mod
@@ -1,14 +1,14 @@
module github.com/grafana/grafana/apps/dashboard
-go 1.24.4
+go 1.24.5
require (
cuelang.org/go v0.11.1
- github.com/grafana/grafana-app-sdk v0.39.2
+ github.com/grafana/grafana-app-sdk v0.40.0
github.com/grafana/grafana-plugin-sdk-go v0.278.0
github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250514132646-acbc7b54ed9e
github.com/stretchr/testify v1.10.0
- k8s.io/apimachinery v0.33.2
+ k8s.io/apimachinery v0.33.3
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff
)
@@ -24,12 +24,12 @@ require (
github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/elazarl/goproxy v1.7.2 // indirect
- github.com/emicklei/go-restful/v3 v3.11.0 // indirect
+ github.com/emicklei/go-restful/v3 v3.12.1 // indirect
github.com/fatih/color v1.18.0 // indirect
github.com/fsnotify/fsnotify v1.9.0 // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/getkin/kin-openapi v0.132.0 // indirect
- github.com/go-logr/logr v1.4.2 // indirect
+ github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
@@ -44,13 +44,15 @@ require (
github.com/google/go-cmp v0.7.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/mux v1.8.1 // indirect
- github.com/grafana/grafana-app-sdk/logging v0.39.1 // indirect
+ github.com/grafana/grafana-app-sdk/logging v0.39.3 // indirect
github.com/grafana/otel-profiling-go v0.5.1 // indirect
github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect
github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0 // indirect
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 // indirect
- github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect
+ github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-hclog v1.6.3 // indirect
+ github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/hashicorp/go-plugin v1.6.3 // indirect
github.com/hashicorp/yamux v0.1.1 // indirect
github.com/jaegertracing/jaeger-idl v0.5.0 // indirect
@@ -61,7 +63,7 @@ require (
github.com/klauspost/cpuid/v2 v2.2.10 // indirect
github.com/lib/pq v1.10.9 // indirect
github.com/magefile/mage v1.15.0 // indirect
- github.com/mailru/easyjson v0.7.7 // indirect
+ github.com/mailru/easyjson v0.9.0 // indirect
github.com/mattetti/filebuffer v1.0.1 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
@@ -80,7 +82,7 @@ require (
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/client_golang v1.22.0 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
- github.com/prometheus/common v0.64.0 // indirect
+ github.com/prometheus/common v0.65.0 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
@@ -95,21 +97,23 @@ require (
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.61.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // indirect
go.opentelemetry.io/contrib/propagators/jaeger v1.36.0 // indirect
go.opentelemetry.io/contrib/samplers/jaegerremote v0.30.0 // indirect
- go.opentelemetry.io/otel v1.36.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0 // indirect
- go.opentelemetry.io/otel/metric v1.36.0 // indirect
- go.opentelemetry.io/otel/sdk v1.36.0 // indirect
- go.opentelemetry.io/otel/sdk/metric v1.36.0 // indirect
- go.opentelemetry.io/otel/trace v1.36.0 // indirect
- go.opentelemetry.io/proto/otlp v1.6.0 // indirect
+ go.opentelemetry.io/otel v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 // indirect
+ go.opentelemetry.io/otel/metric v1.37.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.37.0 // indirect
+ go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect
+ go.opentelemetry.io/otel/trace v1.37.0 // indirect
+ go.opentelemetry.io/proto/otlp v1.7.0 // indirect
+ go.yaml.in/yaml/v2 v2.4.2 // indirect
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
golang.org/x/mod v0.25.0 // indirect
golang.org/x/net v0.41.0 // indirect
golang.org/x/oauth2 v0.30.0 // indirect
- golang.org/x/sync v0.15.0 // indirect
+ golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.33.0 // indirect
golang.org/x/term v0.32.0 // indirect
golang.org/x/text v0.26.0 // indirect
@@ -123,11 +127,11 @@ require (
gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
- k8s.io/client-go v0.33.2 // indirect
+ k8s.io/client-go v0.33.3 // indirect
k8s.io/klog/v2 v2.130.1 // indirect
- k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
- sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
+ k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect
+ sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect
- sigs.k8s.io/yaml v1.4.0 // indirect
+ sigs.k8s.io/yaml v1.5.0 // indirect
)
diff --git a/apps/dashboard/go.sum b/apps/dashboard/go.sum
index b73b3aab637..7e6bab5fbb7 100644
--- a/apps/dashboard/go.sum
+++ b/apps/dashboard/go.sum
@@ -36,8 +36,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o=
github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE=
-github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
-github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU=
+github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/emicklei/proto v1.13.2 h1:z/etSFO3uyXeuEsVPzfl56WNgzcvIr42aQazXaQmFZY=
github.com/emicklei/proto v1.13.2/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
@@ -54,8 +54,8 @@ github.com/getkin/kin-openapi v0.132.0 h1:3ISeLMsQzcb5v26yeJrBcdTCEQTag36ZjaGk7M
github.com/getkin/kin-openapi v0.132.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
-github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
-github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
+github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
@@ -94,10 +94,10 @@ github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1
github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
-github.com/grafana/grafana-app-sdk v0.39.2 h1:ymfr+1318t+JC9U2OYrzVpGmNG/aJONUmFFu/G98Xh8=
-github.com/grafana/grafana-app-sdk v0.39.2/go.mod h1:t0m6q561lpoHQCixS9LUHFUhUzDClzNtm7BH60gHVSY=
-github.com/grafana/grafana-app-sdk/logging v0.39.1 h1:lI5rbrheuwVPuyIM6LIuEYOCSpgmXahfKtqeMyhbGPU=
-github.com/grafana/grafana-app-sdk/logging v0.39.1/go.mod h1:WhDENSnaGHtyVVwZGVnAR7YLvh2xlLDYR3D7E6h7XVk=
+github.com/grafana/grafana-app-sdk v0.40.0 h1:KilbCFMYox2cnIi1W6ql7W+n9kms/NvWlBPM1m4Q4mg=
+github.com/grafana/grafana-app-sdk v0.40.0/go.mod h1:fn943JEM0CR3mY/Gd3816MUcpob5xnKc8MoojnbMjYY=
+github.com/grafana/grafana-app-sdk/logging v0.39.3 h1:mMrcYahnoRu7blKyL/ZVcgv7WCiI2CqxODYh8tBFUgY=
+github.com/grafana/grafana-app-sdk/logging v0.39.3/go.mod h1:otUD9XpJD7A5sCLb8mcs9hIXGdeV6lnhzVwe747g4RU=
github.com/grafana/grafana-plugin-sdk-go v0.278.0 h1:5/rIYparLi02pofdaag8wnjspMMVNCi8cZhC4cdC3Ho=
github.com/grafana/grafana-plugin-sdk-go v0.278.0/go.mod h1:+8NXT/XUJ/89GV6FxGQ366NZ3nU+cAXDMd0OUESF9H4=
github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250514132646-acbc7b54ed9e h1:BTKk7LHuG1kmAkucwTA7DuMbKpKvJTKrGdBmUNO4dfQ=
@@ -110,10 +110,15 @@ github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0 h1:QGLs
github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0/go.mod h1:hM2alZsMUni80N33RBe6J0e423LB+odMj7d3EMP9l20=
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 h1:sGm2vDRFUrQJO/Veii4h4zG2vvqG6uWNkBHSTqXOZk0=
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2/go.mod h1:wd1YpapPLivG6nQgbf7ZkG1hhSOXDhhn4MLTknx2aAc=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90=
+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
+github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=
github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
+github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
+github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
github.com/hashicorp/go-plugin v1.6.3 h1:xgHB+ZUSYeuJi96WtxEjzi23uh7YQpznjGh0U0UUrwg=
github.com/hashicorp/go-plugin v1.6.3/go.mod h1:MRobyh+Wc/nYy1V4KAXUiYfzxoYhs7V1mlH1Z7iY2h0=
github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE=
@@ -149,8 +154,8 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg=
github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A=
-github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
-github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=
+github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
github.com/mattetti/filebuffer v1.0.1 h1:gG7pyfnSIZCxdoKq+cPa8T0hhYtD9NxCdI4D7PTjRLM=
github.com/mattetti/filebuffer v1.0.1/go.mod h1:YdMURNDOttIiruleeVr6f56OrMc+MydEnTcXwtkxNVs=
github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
@@ -208,8 +213,8 @@ github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/
github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
-github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
-github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
+github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE=
+github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
github.com/protocolbuffers/txtpbfmt v0.0.0-20241112170944-20d2c9ebc01d h1:HWfigq7lB31IeJL8iy7jkUmU/PG1Sr8jVGhS749dbUA=
@@ -270,34 +275,38 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.6
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM=
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.61.0 h1:lREC4C0ilyP4WibDhQ7Gg2ygAQFP8oR07Fst/5cafwI=
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.61.0/go.mod h1:HfvuU0kW9HewH14VCOLImqKvUgONodURG7Alj/IrnGI=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY=
go.opentelemetry.io/contrib/propagators/jaeger v1.36.0 h1:SoCgXYF4ISDtNyfLUzsGDaaudZVTx2yJhOyBO0+/GYk=
go.opentelemetry.io/contrib/propagators/jaeger v1.36.0/go.mod h1:VHu48l0YTRKSObdPQ+Sb8xMZvdnJlN7yhHuHoPgNqHM=
go.opentelemetry.io/contrib/samplers/jaegerremote v0.30.0 h1:bQ1Gvah4Sp8z7epSkgJaNTuZm7sutfA6Fji2/7cKFMc=
go.opentelemetry.io/contrib/samplers/jaegerremote v0.30.0/go.mod h1:9b8Q9rH52NgYH3ShiTFB5wf18Vt3RTH/VMB7LDcC1ug=
go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=
-go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg=
-go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0 h1:dNzwXjZKpMpE2JhmO+9HsPl42NIXFIFSUSSs0fiqra0=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0/go.mod h1:90PoxvaEB5n6AOdZvi+yWJQoE95U8Dhhw2bSyRqnTD0=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0 h1:JgtbA0xkWHnTmYk7YusopJFX6uleBmAuZ8n05NEh8nQ=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0/go.mod h1:179AK5aar5R3eS9FucPy6rggvU0g52cvKId8pv4+v0c=
+go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
+go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI=
go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=
-go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE=
-go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs=
+go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
+go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=
-go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs=
-go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY=
-go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis=
-go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4=
+go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
+go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
+go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
+go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=
-go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w=
-go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
-go.opentelemetry.io/proto/otlp v1.6.0 h1:jQjP+AQyTf+Fe7OKj/MfkDrmK4MNVtw2NpXsf9fefDI=
-go.opentelemetry.io/proto/otlp v1.6.0/go.mod h1:cicgGehlFuNdgZkcALOCh3VE6K/u2tAjzlRhDwmVpZc=
+go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
+go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
+go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os=
+go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
+go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
+go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
+go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE=
+go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -319,8 +328,8 @@ golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKl
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
-golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
+golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191020152052-9984515f0562/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -379,24 +388,25 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/api v0.33.2 h1:YgwIS5jKfA+BZg//OQhkJNIfie/kmRsO0BmNaVSimvY=
-k8s.io/api v0.33.2/go.mod h1:fhrbphQJSM2cXzCWgqU29xLDuks4mu7ti9vveEnpSXs=
-k8s.io/apimachinery v0.33.2 h1:IHFVhqg59mb8PJWTLi8m1mAoepkUNYmptHsV+Z1m5jY=
-k8s.io/apimachinery v0.33.2/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
-k8s.io/client-go v0.33.2 h1:z8CIcc0P581x/J1ZYf4CNzRKxRvQAwoAolYPbtQes+E=
-k8s.io/client-go v0.33.2/go.mod h1:9mCgT4wROvL948w6f6ArJNb7yQd7QsvqavDeZHvNmHo=
+k8s.io/api v0.33.3 h1:SRd5t//hhkI1buzxb288fy2xvjubstenEKL9K51KBI8=
+k8s.io/api v0.33.3/go.mod h1:01Y/iLUjNBM3TAvypct7DIj0M0NIZc+PzAHCIo0CYGE=
+k8s.io/apimachinery v0.33.3 h1:4ZSrmNa0c/ZpZJhAgRdcsFcZOw1PQU1bALVQ0B3I5LA=
+k8s.io/apimachinery v0.33.3/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
+k8s.io/client-go v0.33.3 h1:M5AfDnKfYmVJif92ngN532gFqakcGi6RvaOF16efrpA=
+k8s.io/client-go v0.33.3/go.mod h1:luqKBQggEf3shbxHY4uVENAxrDISLOarxpTKMiUuujg=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4=
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo=
+k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0=
+k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc=
sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
-sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
+sigs.k8s.io/yaml v1.5.0 h1:M10b2U7aEUY6hRtU870n2VTPgR5RZiL/I6Lcc2F4NUQ=
+sigs.k8s.io/yaml v1.5.0/go.mod h1:wZs27Rbxoai4C0f8/9urLZtZtF3avA3gKvGyPdDqTO4=
diff --git a/apps/dashboard/kinds/dashboard.cue b/apps/dashboard/kinds/dashboard.cue
index d48765539c8..7c68295d394 100644
--- a/apps/dashboard/kinds/dashboard.cue
+++ b/apps/dashboard/kinds/dashboard.cue
@@ -33,7 +33,6 @@ dashboard: {
kind: "Dashboard"
pluralName: "Dashboards"
current: "v1beta1"
-
codegen: {
ts: {
enabled: true
diff --git a/apps/dashboard/pkg/apis/dashboard_manifest.go b/apps/dashboard/pkg/apis/dashboard_manifest.go
index 59f0032ab5f..2a3c0408c29 100644
--- a/apps/dashboard/pkg/apis/dashboard_manifest.go
+++ b/apps/dashboard/pkg/apis/dashboard_manifest.go
@@ -7,6 +7,7 @@ package apis
import (
"fmt"
+ "strings"
"github.com/grafana/grafana-app-sdk/app"
"github.com/grafana/grafana-app-sdk/resource"
@@ -17,29 +18,60 @@ import (
v2alpha2 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha2"
)
+var ()
+
var appManifestData = app.ManifestData{
AppName: "dashboard",
Group: "dashboard.grafana.app",
- Kinds: []app.ManifestKind{
+ Versions: []app.ManifestVersion{
{
- Kind: "Dashboard",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
+ Name: "v0alpha1",
+ Served: true,
+ Kinds: []app.ManifestVersionKind{
{
- Name: "v0alpha1",
+ Kind: "Dashboard",
+ Plural: "Dashboards",
+ Scope: "Namespaced",
+ Conversion: false,
},
+ },
+ },
+ {
+ Name: "v1beta1",
+ Served: true,
+ Kinds: []app.ManifestVersionKind{
{
- Name: "v1beta1",
+ Kind: "Dashboard",
+ Plural: "Dashboards",
+ Scope: "Namespaced",
+ Conversion: false,
},
+ },
+ },
+ {
+ Name: "v2alpha1",
+ Served: true,
+ Kinds: []app.ManifestVersionKind{
{
- Name: "v2alpha1",
+ Kind: "Dashboard",
+ Plural: "Dashboards",
+ Scope: "Namespaced",
+ Conversion: false,
},
+ },
+ },
+ {
+ Name: "v2alpha2",
+ Served: true,
+ Kinds: []app.ManifestVersionKind{
{
- Name: "v2alpha2",
+ Kind: "Dashboard",
+ Plural: "Dashboards",
+ Scope: "Namespaced",
+ Conversion: false,
},
},
},
@@ -67,3 +99,16 @@ func ManifestGoTypeAssociator(kind, version string) (goType resource.Kind, exist
goType, exists = kindVersionToGoType[fmt.Sprintf("%s/%s", kind, version)]
return goType, exists
}
+
+var customRouteToGoResponseType = map[string]any{}
+
+// ManifestCustomRouteResponsesAssociator returns the associated response go type for a given kind, version, custom route path, and method, if one exists.
+// kind may be empty for custom routes which are not kind subroutes. Leading slashes are removed from subroute paths.
+// If there is no association for the provided kind, version, custom route path, and method, exists will return false.
+func ManifestCustomRouteResponsesAssociator(kind, version, path, verb string) (goType any, exists bool) {
+ if len(path) > 0 && path[0] == '/' {
+ path = path[1:]
+ }
+ goType, exists = customRouteToGoResponseType[fmt.Sprintf("%s|%s|%s|%s", version, kind, path, strings.ToUpper(verb))]
+ return goType, exists
+}
diff --git a/apps/folder/Makefile b/apps/folder/Makefile
index 7a30038bc89..a6abc7a5337 100644
--- a/apps/folder/Makefile
+++ b/apps/folder/Makefile
@@ -1,22 +1,4 @@
-APP_SDK_VERSION := v0.39.0
-APP_SDK_DIR := $(shell go env GOPATH)/bin/app-sdk-$(APP_SDK_VERSION)
-APP_SDK_BIN := $(APP_SDK_DIR)/grafana-app-sdk
-
-.PHONY: install-app-sdk
-install-app-sdk: $(APP_SDK_BIN) ## Install the Grafana App SDK
-
-$(APP_SDK_BIN):
- @echo "Installing Grafana App SDK version $(APP_SDK_VERSION)"
- @mkdir -p $(APP_SDK_DIR)
- # The only way to install specific versions of binaries using `go install`
- # is by setting GOBIN to the directory you want to install the binary to.
- GOBIN=$(APP_SDK_DIR) go install github.com/grafana/grafana-app-sdk/cmd/grafana-app-sdk@$(APP_SDK_VERSION)
- @touch $@
-
-.PHONY: update-app-sdk
-update-app-sdk: ## Update the Grafana App SDK dependency in go.mod
- go get github.com/grafana/grafana-app-sdk@$(APP_SDK_VERSION)
- go mod tidy
+include ../sdk.mk
.PHONY: generate
generate: install-app-sdk update-app-sdk ## Run Grafana App SDK code generation
@@ -26,4 +8,5 @@ generate: install-app-sdk update-app-sdk ## Run Grafana App SDK code generation
--grouping=group \
--defencoding=none \
--genoperatorstate=false \
- --noschemasinmanifest
+ --noschemasinmanifest \
+ --useoldmanifestkinds
diff --git a/apps/folder/go.mod b/apps/folder/go.mod
index 88db83aa995..b378d607620 100644
--- a/apps/folder/go.mod
+++ b/apps/folder/go.mod
@@ -1,11 +1,11 @@
module github.com/grafana/grafana/apps/folder
-go 1.24.4
+go 1.24.5
require (
- github.com/grafana/grafana-app-sdk v0.39.2
+ github.com/grafana/grafana-app-sdk v0.40.0
github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250514132646-acbc7b54ed9e
- k8s.io/apimachinery v0.33.2
+ k8s.io/apimachinery v0.33.3
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff
)
@@ -13,20 +13,22 @@ require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
- github.com/emicklei/go-restful/v3 v3.11.0 // indirect
+ github.com/emicklei/go-restful/v3 v3.12.1 // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/getkin/kin-openapi v0.132.0 // indirect
- github.com/go-logr/logr v1.4.2 // indirect
+ github.com/go-logr/logr v1.4.3 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
github.com/go-openapi/swag v0.23.0 // indirect
github.com/go-test/deep v1.1.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/google/gnostic-models v0.6.9 // indirect
- github.com/grafana/grafana-app-sdk/logging v0.39.1 // indirect
+ github.com/grafana/grafana-app-sdk/logging v0.39.3 // indirect
+ github.com/hashicorp/errwrap v1.1.0 // indirect
+ github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
- github.com/mailru/easyjson v0.7.7 // indirect
+ github.com/mailru/easyjson v0.9.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
@@ -37,13 +39,14 @@ require (
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/client_golang v1.22.0 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
- github.com/prometheus/common v0.64.0 // indirect
+ github.com/prometheus/common v0.65.0 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/stretchr/testify v1.10.0 // indirect
github.com/x448/float16 v0.8.4 // indirect
- go.opentelemetry.io/otel v1.36.0 // indirect
- go.opentelemetry.io/otel/trace v1.36.0 // indirect
+ go.opentelemetry.io/otel v1.37.0 // indirect
+ go.opentelemetry.io/otel/trace v1.37.0 // indirect
+ go.yaml.in/yaml/v2 v2.4.2 // indirect
golang.org/x/net v0.41.0 // indirect
golang.org/x/oauth2 v0.30.0 // indirect
golang.org/x/sys v0.33.0 // indirect
@@ -53,11 +56,11 @@ require (
google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
- k8s.io/client-go v0.33.2 // indirect
+ k8s.io/client-go v0.33.3 // indirect
k8s.io/klog/v2 v2.130.1 // indirect
- k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
- sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
+ k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect
+ sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect
- sigs.k8s.io/yaml v1.4.0 // indirect
+ sigs.k8s.io/yaml v1.5.0 // indirect
)
diff --git a/apps/folder/go.sum b/apps/folder/go.sum
index 8f346fcbfcd..b7f94082f13 100644
--- a/apps/folder/go.sum
+++ b/apps/folder/go.sum
@@ -6,14 +6,14 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
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/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
-github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU=
+github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
github.com/getkin/kin-openapi v0.132.0 h1:3ISeLMsQzcb5v26yeJrBcdTCEQTag36ZjaGk7MIRUwk=
github.com/getkin/kin-openapi v0.132.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58=
-github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
-github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
+github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
@@ -32,12 +32,17 @@ github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/grafana/grafana-app-sdk v0.39.2 h1:ymfr+1318t+JC9U2OYrzVpGmNG/aJONUmFFu/G98Xh8=
-github.com/grafana/grafana-app-sdk v0.39.2/go.mod h1:t0m6q561lpoHQCixS9LUHFUhUzDClzNtm7BH60gHVSY=
-github.com/grafana/grafana-app-sdk/logging v0.39.1 h1:lI5rbrheuwVPuyIM6LIuEYOCSpgmXahfKtqeMyhbGPU=
-github.com/grafana/grafana-app-sdk/logging v0.39.1/go.mod h1:WhDENSnaGHtyVVwZGVnAR7YLvh2xlLDYR3D7E6h7XVk=
+github.com/grafana/grafana-app-sdk v0.40.0 h1:KilbCFMYox2cnIi1W6ql7W+n9kms/NvWlBPM1m4Q4mg=
+github.com/grafana/grafana-app-sdk v0.40.0/go.mod h1:fn943JEM0CR3mY/Gd3816MUcpob5xnKc8MoojnbMjYY=
+github.com/grafana/grafana-app-sdk/logging v0.39.3 h1:mMrcYahnoRu7blKyL/ZVcgv7WCiI2CqxODYh8tBFUgY=
+github.com/grafana/grafana-app-sdk/logging v0.39.3/go.mod h1:otUD9XpJD7A5sCLb8mcs9hIXGdeV6lnhzVwe747g4RU=
github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250514132646-acbc7b54ed9e h1:BTKk7LHuG1kmAkucwTA7DuMbKpKvJTKrGdBmUNO4dfQ=
github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250514132646-acbc7b54ed9e/go.mod h1:IA4SOwun8QyST9c5UNs/fN37XL6boXXDvRYFcFwbipg=
+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
+github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
+github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
@@ -52,8 +57,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
-github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
-github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=
+github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -78,8 +83,8 @@ github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/
github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
-github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
-github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
+github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE=
+github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
@@ -98,10 +103,14 @@ github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg=
-go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
-go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w=
-go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
+go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
+go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
+go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
+go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
+go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
+go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
+go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE=
+go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -150,24 +159,25 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/api v0.33.2 h1:YgwIS5jKfA+BZg//OQhkJNIfie/kmRsO0BmNaVSimvY=
-k8s.io/api v0.33.2/go.mod h1:fhrbphQJSM2cXzCWgqU29xLDuks4mu7ti9vveEnpSXs=
-k8s.io/apimachinery v0.33.2 h1:IHFVhqg59mb8PJWTLi8m1mAoepkUNYmptHsV+Z1m5jY=
-k8s.io/apimachinery v0.33.2/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
-k8s.io/client-go v0.33.2 h1:z8CIcc0P581x/J1ZYf4CNzRKxRvQAwoAolYPbtQes+E=
-k8s.io/client-go v0.33.2/go.mod h1:9mCgT4wROvL948w6f6ArJNb7yQd7QsvqavDeZHvNmHo=
+k8s.io/api v0.33.3 h1:SRd5t//hhkI1buzxb288fy2xvjubstenEKL9K51KBI8=
+k8s.io/api v0.33.3/go.mod h1:01Y/iLUjNBM3TAvypct7DIj0M0NIZc+PzAHCIo0CYGE=
+k8s.io/apimachinery v0.33.3 h1:4ZSrmNa0c/ZpZJhAgRdcsFcZOw1PQU1bALVQ0B3I5LA=
+k8s.io/apimachinery v0.33.3/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
+k8s.io/client-go v0.33.3 h1:M5AfDnKfYmVJif92ngN532gFqakcGi6RvaOF16efrpA=
+k8s.io/client-go v0.33.3/go.mod h1:luqKBQggEf3shbxHY4uVENAxrDISLOarxpTKMiUuujg=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4=
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo=
+k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0=
+k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc=
sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
-sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
+sigs.k8s.io/yaml v1.5.0 h1:M10b2U7aEUY6hRtU870n2VTPgR5RZiL/I6Lcc2F4NUQ=
+sigs.k8s.io/yaml v1.5.0/go.mod h1:wZs27Rbxoai4C0f8/9urLZtZtF3avA3gKvGyPdDqTO4=
diff --git a/apps/folder/kinds/folder.cue b/apps/folder/kinds/folder.cue
index d0da0db7082..44423768205 100644
--- a/apps/folder/kinds/folder.cue
+++ b/apps/folder/kinds/folder.cue
@@ -4,17 +4,16 @@ folder: {
kind: "Folder"
pluralName: "Folders"
current: "v1beta1"
- codegen: {
- ts: {
- enabled: false // Not sure if it should be enabled or not, currently it is.
- }
- go: {
- enabled: true
- }
- }
-
versions: {
"v1beta1": {
+ codegen: {
+ ts: {
+ enabled: false // Not sure if it should be enabled or not, currently it is.
+ }
+ go: {
+ enabled: true
+ }
+ }
schema: {
spec: {
title: string
diff --git a/apps/folder/pkg/apis/folder_manifest.go b/apps/folder/pkg/apis/folder_manifest.go
index 8491ddc6083..8628efe6537 100644
--- a/apps/folder/pkg/apis/folder_manifest.go
+++ b/apps/folder/pkg/apis/folder_manifest.go
@@ -7,6 +7,7 @@ package apis
import (
"fmt"
+ "strings"
"github.com/grafana/grafana-app-sdk/app"
"github.com/grafana/grafana-app-sdk/resource"
@@ -14,17 +15,21 @@ import (
v1beta1 "github.com/grafana/grafana/apps/folder/pkg/apis/folder/v1beta1"
)
+var ()
+
var appManifestData = app.ManifestData{
AppName: "folder",
Group: "folder.grafana.app",
- Kinds: []app.ManifestKind{
+ Versions: []app.ManifestVersion{
{
- Kind: "Folder",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
+ Name: "v1beta1",
+ Served: true,
+ Kinds: []app.ManifestVersionKind{
{
- Name: "v1beta1",
+ Kind: "Folder",
+ Plural: "Folders",
+ Scope: "Namespaced",
+ Conversion: false,
},
},
},
@@ -49,3 +54,16 @@ func ManifestGoTypeAssociator(kind, version string) (goType resource.Kind, exist
goType, exists = kindVersionToGoType[fmt.Sprintf("%s/%s", kind, version)]
return goType, exists
}
+
+var customRouteToGoResponseType = map[string]any{}
+
+// ManifestCustomRouteResponsesAssociator returns the associated response go type for a given kind, version, custom route path, and method, if one exists.
+// kind may be empty for custom routes which are not kind subroutes. Leading slashes are removed from subroute paths.
+// If there is no association for the provided kind, version, custom route path, and method, exists will return false.
+func ManifestCustomRouteResponsesAssociator(kind, version, path, verb string) (goType any, exists bool) {
+ if len(path) > 0 && path[0] == '/' {
+ path = path[1:]
+ }
+ goType, exists = customRouteToGoResponseType[fmt.Sprintf("%s|%s|%s|%s", version, kind, path, strings.ToUpper(verb))]
+ return goType, exists
+}
diff --git a/apps/iam/Makefile b/apps/iam/Makefile
index 7188b890ad4..6839689c867 100644
--- a/apps/iam/Makefile
+++ b/apps/iam/Makefile
@@ -1,22 +1,4 @@
-APP_SDK_VERSION := v0.39.0
-APP_SDK_DIR := $(shell go env GOPATH)/bin/app-sdk-$(APP_SDK_VERSION)
-APP_SDK_BIN := $(APP_SDK_DIR)/grafana-app-sdk
-
-.PHONY: install-app-sdk
-install-app-sdk: $(APP_SDK_BIN) ## Install the Grafana App SDK
-
-$(APP_SDK_BIN):
- @echo "Installing Grafana App SDK version $(APP_SDK_VERSION)"
- @mkdir -p $(APP_SDK_DIR)
- # The only way to install specific versions of binaries using `go install`
- # is by setting GOBIN to the directory you want to install the binary to.
- GOBIN=$(APP_SDK_DIR) go install github.com/grafana/grafana-app-sdk/cmd/grafana-app-sdk@$(APP_SDK_VERSION)
- @touch $@
-
-.PHONY: update-app-sdk
-update-app-sdk: ## Update the Grafana App SDK dependency in go.mod
- go get github.com/grafana/grafana-app-sdk@$(APP_SDK_VERSION)
- go mod tidy
+include ../sdk.mk
.PHONY: generate
generate: install-app-sdk update-app-sdk ## Run Grafana App SDK code generation
@@ -26,4 +8,4 @@ generate: install-app-sdk update-app-sdk ## Run Grafana App SDK code generation
--grouping=group \
--defencoding=none \
--noschemasinmanifest \
- --postprocess
\ No newline at end of file
+ --postprocess \
\ No newline at end of file
diff --git a/apps/iam/go.mod b/apps/iam/go.mod
index 5c4086d8596..43260a0bf87 100644
--- a/apps/iam/go.mod
+++ b/apps/iam/go.mod
@@ -1,11 +1,11 @@
module github.com/grafana/grafana/apps/iam
-go 1.24.4
+go 1.24.5
require (
- github.com/grafana/grafana-app-sdk v0.39.2
+ github.com/grafana/grafana-app-sdk v0.40.0
github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250514132646-acbc7b54ed9e
- k8s.io/apimachinery v0.33.2
+ k8s.io/apimachinery v0.33.3
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff
)
@@ -13,20 +13,22 @@ require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
- github.com/emicklei/go-restful/v3 v3.11.0 // indirect
+ github.com/emicklei/go-restful/v3 v3.12.1 // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/getkin/kin-openapi v0.132.0 // indirect
- github.com/go-logr/logr v1.4.2 // indirect
+ github.com/go-logr/logr v1.4.3 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
github.com/go-openapi/swag v0.23.0 // indirect
github.com/go-test/deep v1.1.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/google/gnostic-models v0.6.9 // indirect
- github.com/grafana/grafana-app-sdk/logging v0.39.1 // indirect
+ github.com/grafana/grafana-app-sdk/logging v0.39.3 // indirect
+ github.com/hashicorp/errwrap v1.1.0 // indirect
+ github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
- github.com/mailru/easyjson v0.7.7 // indirect
+ github.com/mailru/easyjson v0.9.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
@@ -37,13 +39,14 @@ require (
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/client_golang v1.22.0 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
- github.com/prometheus/common v0.64.0 // indirect
+ github.com/prometheus/common v0.65.0 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/stretchr/testify v1.10.0 // indirect
github.com/x448/float16 v0.8.4 // indirect
- go.opentelemetry.io/otel v1.36.0 // indirect
- go.opentelemetry.io/otel/trace v1.36.0 // indirect
+ go.opentelemetry.io/otel v1.37.0 // indirect
+ go.opentelemetry.io/otel/trace v1.37.0 // indirect
+ go.yaml.in/yaml/v2 v2.4.2 // indirect
golang.org/x/net v0.41.0 // indirect
golang.org/x/oauth2 v0.30.0 // indirect
golang.org/x/sys v0.33.0 // indirect
@@ -53,11 +56,11 @@ require (
google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
- k8s.io/client-go v0.33.2 // indirect
+ k8s.io/client-go v0.33.3 // indirect
k8s.io/klog/v2 v2.130.1 // indirect
- k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
- sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
+ k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect
+ sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect
- sigs.k8s.io/yaml v1.4.0 // indirect
+ sigs.k8s.io/yaml v1.5.0 // indirect
)
diff --git a/apps/iam/go.sum b/apps/iam/go.sum
index 8f346fcbfcd..b7f94082f13 100644
--- a/apps/iam/go.sum
+++ b/apps/iam/go.sum
@@ -6,14 +6,14 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
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/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
-github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU=
+github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
github.com/getkin/kin-openapi v0.132.0 h1:3ISeLMsQzcb5v26yeJrBcdTCEQTag36ZjaGk7MIRUwk=
github.com/getkin/kin-openapi v0.132.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58=
-github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
-github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
+github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
@@ -32,12 +32,17 @@ github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/grafana/grafana-app-sdk v0.39.2 h1:ymfr+1318t+JC9U2OYrzVpGmNG/aJONUmFFu/G98Xh8=
-github.com/grafana/grafana-app-sdk v0.39.2/go.mod h1:t0m6q561lpoHQCixS9LUHFUhUzDClzNtm7BH60gHVSY=
-github.com/grafana/grafana-app-sdk/logging v0.39.1 h1:lI5rbrheuwVPuyIM6LIuEYOCSpgmXahfKtqeMyhbGPU=
-github.com/grafana/grafana-app-sdk/logging v0.39.1/go.mod h1:WhDENSnaGHtyVVwZGVnAR7YLvh2xlLDYR3D7E6h7XVk=
+github.com/grafana/grafana-app-sdk v0.40.0 h1:KilbCFMYox2cnIi1W6ql7W+n9kms/NvWlBPM1m4Q4mg=
+github.com/grafana/grafana-app-sdk v0.40.0/go.mod h1:fn943JEM0CR3mY/Gd3816MUcpob5xnKc8MoojnbMjYY=
+github.com/grafana/grafana-app-sdk/logging v0.39.3 h1:mMrcYahnoRu7blKyL/ZVcgv7WCiI2CqxODYh8tBFUgY=
+github.com/grafana/grafana-app-sdk/logging v0.39.3/go.mod h1:otUD9XpJD7A5sCLb8mcs9hIXGdeV6lnhzVwe747g4RU=
github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250514132646-acbc7b54ed9e h1:BTKk7LHuG1kmAkucwTA7DuMbKpKvJTKrGdBmUNO4dfQ=
github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250514132646-acbc7b54ed9e/go.mod h1:IA4SOwun8QyST9c5UNs/fN37XL6boXXDvRYFcFwbipg=
+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
+github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
+github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
@@ -52,8 +57,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
-github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
-github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=
+github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -78,8 +83,8 @@ github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/
github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
-github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
-github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
+github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE=
+github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
@@ -98,10 +103,14 @@ github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
-go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg=
-go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
-go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w=
-go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
+go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
+go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
+go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
+go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
+go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
+go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
+go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE=
+go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -150,24 +159,25 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/api v0.33.2 h1:YgwIS5jKfA+BZg//OQhkJNIfie/kmRsO0BmNaVSimvY=
-k8s.io/api v0.33.2/go.mod h1:fhrbphQJSM2cXzCWgqU29xLDuks4mu7ti9vveEnpSXs=
-k8s.io/apimachinery v0.33.2 h1:IHFVhqg59mb8PJWTLi8m1mAoepkUNYmptHsV+Z1m5jY=
-k8s.io/apimachinery v0.33.2/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
-k8s.io/client-go v0.33.2 h1:z8CIcc0P581x/J1ZYf4CNzRKxRvQAwoAolYPbtQes+E=
-k8s.io/client-go v0.33.2/go.mod h1:9mCgT4wROvL948w6f6ArJNb7yQd7QsvqavDeZHvNmHo=
+k8s.io/api v0.33.3 h1:SRd5t//hhkI1buzxb288fy2xvjubstenEKL9K51KBI8=
+k8s.io/api v0.33.3/go.mod h1:01Y/iLUjNBM3TAvypct7DIj0M0NIZc+PzAHCIo0CYGE=
+k8s.io/apimachinery v0.33.3 h1:4ZSrmNa0c/ZpZJhAgRdcsFcZOw1PQU1bALVQ0B3I5LA=
+k8s.io/apimachinery v0.33.3/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
+k8s.io/client-go v0.33.3 h1:M5AfDnKfYmVJif92ngN532gFqakcGi6RvaOF16efrpA=
+k8s.io/client-go v0.33.3/go.mod h1:luqKBQggEf3shbxHY4uVENAxrDISLOarxpTKMiUuujg=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4=
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo=
+k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0=
+k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc=
sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
-sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
+sigs.k8s.io/yaml v1.5.0 h1:M10b2U7aEUY6hRtU870n2VTPgR5RZiL/I6Lcc2F4NUQ=
+sigs.k8s.io/yaml v1.5.0/go.mod h1:wZs27Rbxoai4C0f8/9urLZtZtF3avA3gKvGyPdDqTO4=
diff --git a/apps/iam/kinds/manifest.cue b/apps/iam/kinds/manifest.cue
index 032261e9030..60a6d1f8faf 100644
--- a/apps/iam/kinds/manifest.cue
+++ b/apps/iam/kinds/manifest.cue
@@ -1,18 +1,24 @@
package kinds
manifest: {
- appName: "iam"
+ appName: "iam"
groupOverride: "iam.grafana.app"
- kinds: [
- globalrole,
- globalrolebinding,
- corerole,
- role,
- rolebinding,
- resourcepermission,
- user,
- team,
- teambinding,
- serviceaccount,
- ]
+ versions: {
+ "v0alpha1": v0alpha1
+ }
}
+
+v0alpha1: {
+ kinds: [
+ globalrolev0alpha1,
+ globalrolebindingv0alpha1,
+ corerolev0alpha1,
+ rolev0alpha1,
+ rolebindingv0alpha1,
+ resourcepermissionv0alpha1,
+ userv0alpha1,
+ teamv0alpha1,
+ teambindingv0alpha1,
+ serviceaccountv0alpha1,
+ ]
+}
\ No newline at end of file
diff --git a/apps/iam/kinds/resourcepermission.cue b/apps/iam/kinds/resourcepermission.cue
index 46e27b160fe..42fcddfe6fc 100644
--- a/apps/iam/kinds/resourcepermission.cue
+++ b/apps/iam/kinds/resourcepermission.cue
@@ -4,21 +4,17 @@ import (
"github.com/grafana/grafana/apps/iam/kinds/v0alpha1"
)
-resourcepermission: {
+resourcepermissionKind: {
kind: "ResourcePermission"
pluralName: "ResourcePermissions"
- current: "v0alpha1"
-
codegen: {
ts: { enabled: false }
go: { enabled: true }
}
+}
- versions: {
- "v0alpha1": {
- schema: {
- spec: v0alpha1.ResourcePermission
- }
- }
+resourcepermissionv0alpha1: resourcepermissionKind & {
+ schema: {
+ spec: v0alpha1.ResourcePermission
}
}
diff --git a/apps/iam/kinds/role.cue b/apps/iam/kinds/role.cue
index 1422a57d246..1911fe83616 100644
--- a/apps/iam/kinds/role.cue
+++ b/apps/iam/kinds/role.cue
@@ -4,59 +4,47 @@ import (
"github.com/grafana/grafana/apps/iam/kinds/v0alpha1"
)
-role: {
+roleKind: {
kind: "Role"
pluralName: "Roles"
- current: "v0alpha1"
-
codegen: {
ts: { enabled: false }
go: { enabled: true }
}
-
- versions: {
- "v0alpha1": {
- schema: {
- spec: v0alpha1.RoleSpec
- }
- }
- }
}
-corerole: {
+coreroleKind: {
kind: "CoreRole"
pluralName: "CoreRoles"
- current: "v0alpha1"
-
codegen: {
ts: { enabled: false }
go: { enabled: true }
}
-
- versions: {
- "v0alpha1": {
- schema: {
- spec: v0alpha1.RoleSpec
- }
- }
- }
}
-globalrole: {
+globalroleKind: {
kind: "GlobalRole"
pluralName: "GlobalRoles"
- current: "v0alpha1"
-
codegen: {
ts: { enabled: false }
go: { enabled: true }
}
+}
- versions: {
- "v0alpha1": {
- schema: {
- spec: v0alpha1.RoleSpec
- }
- }
+rolev0alpha1: roleKind & {
+ schema: {
+ spec: v0alpha1.RoleSpec
+ }
+}
+
+corerolev0alpha1: coreroleKind & {
+ schema: {
+ spec: v0alpha1.RoleSpec
+ }
+}
+
+globalrolev0alpha1: globalroleKind & {
+ schema: {
+ spec: v0alpha1.RoleSpec
}
}
\ No newline at end of file
diff --git a/apps/iam/kinds/rolebinding.cue b/apps/iam/kinds/rolebinding.cue
index caee8c22717..119b958970c 100644
--- a/apps/iam/kinds/rolebinding.cue
+++ b/apps/iam/kinds/rolebinding.cue
@@ -4,40 +4,32 @@ import (
"github.com/grafana/grafana/apps/iam/kinds/v0alpha1"
)
-rolebinding: {
+rolebindingKind: {
kind: "RoleBinding"
pluralName: "RoleBindings"
- current: "v0alpha1"
-
codegen: {
ts: { enabled: false }
go: { enabled: true }
}
-
- versions: {
- "v0alpha1": {
- schema: {
- spec: v0alpha1.RoleBindingSpec
- }
- }
- }
}
-globalrolebinding: {
+globalrolebindingKind: {
kind: "GlobalRoleBinding"
pluralName: "GlobalRoleBindings"
- current: "v0alpha1"
-
codegen: {
ts: { enabled: false }
go: { enabled: true }
}
+}
- versions: {
- "v0alpha1": {
- schema: {
- spec: v0alpha1.GlobalRoleBindingSpec
- }
- }
+rolebindingv0alpha1: rolebindingKind & {
+ schema: {
+ spec: v0alpha1.RoleBindingSpec
+ }
+}
+
+globalrolebindingv0alpha1: globalrolebindingKind & {
+ schema: {
+ spec: v0alpha1.GlobalRoleBindingSpec
}
}
diff --git a/apps/iam/kinds/serviceaccount.cue b/apps/iam/kinds/serviceaccount.cue
index 22fb1e9e9cf..72b5c10025b 100644
--- a/apps/iam/kinds/serviceaccount.cue
+++ b/apps/iam/kinds/serviceaccount.cue
@@ -4,21 +4,17 @@ import (
"github.com/grafana/grafana/apps/iam/kinds/v0alpha1"
)
-serviceaccount: {
+serviceaccountKind: {
kind: "ServiceAccount"
pluralName: "ServiceAccounts"
- current: "v0alpha1"
-
codegen: {
ts: { enabled: false }
go: { enabled: true }
}
-
- versions: {
- "v0alpha1": {
- schema: {
- spec: v0alpha1.ServiceAccountSpec
- }
- }
- }
}
+
+serviceaccountv0alpha1: serviceaccountKind & {
+ schema: {
+ spec: v0alpha1.ServiceAccountSpec
+ }
+}
\ No newline at end of file
diff --git a/apps/iam/kinds/team.cue b/apps/iam/kinds/team.cue
index 284d9e601ea..9acf9d60c01 100644
--- a/apps/iam/kinds/team.cue
+++ b/apps/iam/kinds/team.cue
@@ -4,21 +4,18 @@ import (
"github.com/grafana/grafana/apps/iam/kinds/v0alpha1"
)
-team: {
+teamKind: {
kind: "Team"
pluralName: "Teams"
current: "v0alpha1"
-
codegen: {
ts: { enabled: false }
go: { enabled: true }
}
+}
- versions: {
- "v0alpha1": {
- schema: {
- spec: v0alpha1.TeamSpec
- }
- }
+teamv0alpha1: teamKind & {
+ schema: {
+ spec: v0alpha1.TeamSpec
}
}
diff --git a/apps/iam/kinds/teambinding.cue b/apps/iam/kinds/teambinding.cue
index 3f0805b0307..60870b58853 100644
--- a/apps/iam/kinds/teambinding.cue
+++ b/apps/iam/kinds/teambinding.cue
@@ -4,21 +4,17 @@ import (
"github.com/grafana/grafana/apps/iam/kinds/v0alpha1"
)
-teambinding: {
+teambindingKind: {
kind: "TeamBinding"
pluralName: "TeamBindings"
- current: "v0alpha1"
-
codegen: {
ts: { enabled: false }
go: { enabled: true }
}
+}
- versions: {
- "v0alpha1": {
- schema: {
- spec: v0alpha1.TeamBindingSpec
- }
- }
+teambindingv0alpha1: teambindingKind & {
+ schema: {
+ spec: v0alpha1.TeamBindingSpec
}
}
diff --git a/apps/iam/kinds/user.cue b/apps/iam/kinds/user.cue
index c8fc73c184c..480391dfa2e 100644
--- a/apps/iam/kinds/user.cue
+++ b/apps/iam/kinds/user.cue
@@ -4,28 +4,17 @@ import (
"github.com/grafana/grafana/apps/iam/kinds/v0alpha1"
)
-user: {
+userKind: {
kind: "User"
pluralName: "Users"
- current: "v0alpha1"
-
codegen: {
ts: { enabled: false }
go: { enabled: true }
}
+}
- versions: {
- "v0alpha1": {
- validation: {
- operations: [
- "CREATE",
- "UPDATE",
- ]
- }
-
- schema: {
- spec: v0alpha1.UserSpec
- }
- }
+userv0alpha1: userKind & {
+ schema: {
+ spec: v0alpha1.UserSpec
}
}
diff --git a/apps/iam/pkg/apis/iam_manifest.go b/apps/iam/pkg/apis/iam_manifest.go
index 2ae327f76e6..c534546ff64 100644
--- a/apps/iam/pkg/apis/iam_manifest.go
+++ b/apps/iam/pkg/apis/iam_manifest.go
@@ -7,6 +7,7 @@ package apis
import (
"fmt"
+ "strings"
"github.com/grafana/grafana-app-sdk/app"
"github.com/grafana/grafana-app-sdk/resource"
@@ -14,126 +15,82 @@ import (
v0alpha1 "github.com/grafana/grafana/apps/iam/pkg/apis/iam/v0alpha1"
)
-var ()
-
var appManifestData = app.ManifestData{
AppName: "iam",
Group: "iam.grafana.app",
- Kinds: []app.ManifestKind{
+ Versions: []app.ManifestVersion{
{
- Kind: "GlobalRole",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
+ Name: "v0alpha1",
+ Served: true,
+ Kinds: []app.ManifestVersionKind{
{
- Name: "v0alpha1",
+ Kind: "GlobalRole",
+ Plural: "GlobalRoles",
+ Scope: "Namespaced",
+ Conversion: false,
},
- },
- },
- {
- Kind: "GlobalRoleBinding",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
{
- Name: "v0alpha1",
+ Kind: "GlobalRoleBinding",
+ Plural: "GlobalRoleBindings",
+ Scope: "Namespaced",
+ Conversion: false,
},
- },
- },
- {
- Kind: "CoreRole",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
{
- Name: "v0alpha1",
+ Kind: "CoreRole",
+ Plural: "CoreRoles",
+ Scope: "Namespaced",
+ Conversion: false,
},
- },
- },
- {
- Kind: "Role",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
{
- Name: "v0alpha1",
+ Kind: "Role",
+ Plural: "Roles",
+ Scope: "Namespaced",
+ Conversion: false,
},
- },
- },
- {
- Kind: "RoleBinding",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
{
- Name: "v0alpha1",
+ Kind: "RoleBinding",
+ Plural: "RoleBindings",
+ Scope: "Namespaced",
+ Conversion: false,
},
- },
- },
- {
- Kind: "ResourcePermission",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
{
- Name: "v0alpha1",
+ Kind: "ResourcePermission",
+ Plural: "ResourcePermissions",
+ Scope: "Namespaced",
+ Conversion: false,
},
- },
- },
- {
- Kind: "User",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
{
- Name: "v0alpha1",
- Admission: &app.AdmissionCapabilities{
- Validation: &app.ValidationCapability{
- Operations: []app.AdmissionOperation{
- app.AdmissionOperationCreate,
- app.AdmissionOperationUpdate,
- },
- },
- },
+ Kind: "User",
+ Plural: "Users",
+ Scope: "Namespaced",
+ Conversion: false,
},
- },
- },
- {
- Kind: "Team",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
{
- Name: "v0alpha1",
+ Kind: "Team",
+ Plural: "Teams",
+ Scope: "Namespaced",
+ Conversion: false,
},
- },
- },
- {
- Kind: "TeamBinding",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
{
- Name: "v0alpha1",
+ Kind: "TeamBinding",
+ Plural: "TeamBindings",
+ Scope: "Namespaced",
+ Conversion: false,
},
- },
- },
- {
- Kind: "ServiceAccount",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
{
- Name: "v0alpha1",
+ Kind: "ServiceAccount",
+ Plural: "ServiceAccounts",
+ Scope: "Namespaced",
+ Conversion: false,
},
},
},
@@ -167,3 +124,16 @@ func ManifestGoTypeAssociator(kind, version string) (goType resource.Kind, exist
goType, exists = kindVersionToGoType[fmt.Sprintf("%s/%s", kind, version)]
return goType, exists
}
+
+var customRouteToGoResponseType = map[string]any{}
+
+// ManifestCustomRouteResponsesAssociator returns the associated response go type for a given kind, version, custom route path, and method, if one exists.
+// kind may be empty for custom routes which are not kind subroutes. Leading slashes are removed from subroute paths.
+// If there is no association for the provided kind, version, custom route path, and method, exists will return false.
+func ManifestCustomRouteResponsesAssociator(kind, version, path, verb string) (goType any, exists bool) {
+ if len(path) > 0 && path[0] == '/' {
+ path = path[1:]
+ }
+ goType, exists = customRouteToGoResponseType[fmt.Sprintf("%s|%s|%s|%s", version, kind, path, strings.ToUpper(verb))]
+ return goType, exists
+}
diff --git a/apps/investigations/Makefile b/apps/investigations/Makefile
index 7a5f1c99365..aaac06377ca 100644
--- a/apps/investigations/Makefile
+++ b/apps/investigations/Makefile
@@ -1,3 +1,5 @@
+include ../sdk.mk
+
.PHONY: generate
-generate:
- @grafana-app-sdk generate -g ./pkg/apis --grouping=group --postprocess --defencoding=none
+generate: install-app-sdk update-app-sdk
+ @$(APP_SDK_BIN) generate -g ./pkg/apis --grouping=group --postprocess --defencoding=none --useoldmanifestkinds
diff --git a/apps/investigations/go.mod b/apps/investigations/go.mod
index f37ff9db9e4..ec8c3d01dae 100644
--- a/apps/investigations/go.mod
+++ b/apps/investigations/go.mod
@@ -1,94 +1,215 @@
module github.com/grafana/grafana/apps/investigations
-go 1.24.4
+go 1.24.5
require (
- github.com/grafana/grafana-app-sdk v0.39.0
- k8s.io/apimachinery v0.33.1
+ github.com/grafana/grafana v0.0.0-00010101000000-000000000000
+ github.com/grafana/grafana-app-sdk v0.40.0
+ github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250725152715-69d3b9023cec
+ github.com/stretchr/testify v1.10.0
+ k8s.io/apimachinery v0.33.3
+ k8s.io/apiserver v0.33.3
k8s.io/klog/v2 v2.130.1
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff
)
+// transitive dependencies that need replaced
+// TODO: stop depending on grafana core
+replace github.com/grafana/grafana => ../..
+
+replace github.com/prometheus/alertmanager => github.com/grafana/prometheus-alertmanager v0.25.1-0.20250620093340-be61a673dee6
+
require (
+ filippo.io/edwards25519 v1.1.0 // indirect
+ github.com/BurntSushi/toml v1.5.0 // indirect
+ github.com/VividCortex/mysqlerr v0.0.0-20170204212430-6c6b55f8796f // indirect
+ github.com/apache/arrow-go/v18 v18.3.0 // indirect
+ github.com/armon/go-metrics v0.4.1 // indirect
+ github.com/aws/aws-sdk-go-v2 v1.36.5 // indirect
+ github.com/aws/aws-sdk-go-v2/credentials v1.17.70 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36 // indirect
+ github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 // indirect
+ github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17 // indirect
+ github.com/aws/aws-sdk-go-v2/service/sts v1.34.0 // indirect
+ github.com/aws/smithy-go v1.22.4 // indirect
github.com/beorn7/perks v1.0.1 // indirect
+ github.com/blang/semver/v4 v4.0.0 // indirect
+ github.com/bluele/gcache v0.0.2 // indirect
github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 // indirect
- github.com/cenkalti/backoff/v4 v4.3.0 // indirect
+ github.com/bwmarrin/snowflake v0.3.0 // indirect
+ github.com/cenkalti/backoff/v5 v5.0.2 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
+ github.com/cheekybits/genny v1.0.0 // indirect
+ github.com/chromedp/cdproto v0.0.0-20250429231605-6ed5b53462d4 // indirect
+ github.com/coreos/go-systemd/v22 v22.5.0 // indirect
+ github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
- github.com/emicklei/go-restful/v3 v3.11.0 // indirect
+ github.com/elazarl/goproxy v1.7.2 // indirect
+ github.com/emicklei/go-restful/v3 v3.12.1 // indirect
github.com/evanphx/json-patch v5.6.0+incompatible // indirect
+ github.com/fatih/color v1.18.0 // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/getkin/kin-openapi v0.132.0 // indirect
- github.com/go-logr/logr v1.4.2 // indirect
+ github.com/go-jose/go-jose/v3 v3.0.4 // indirect
+ github.com/go-kit/log v0.2.1 // indirect
+ github.com/go-logfmt/logfmt v0.6.0 // indirect
+ github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
github.com/go-openapi/swag v0.23.0 // indirect
- github.com/go-viper/mapstructure/v2 v2.3.0 // indirect
+ github.com/go-sql-driver/mysql v1.9.2 // indirect
+ github.com/go-stack/stack v1.8.1 // indirect
+ github.com/gobwas/glob v0.2.3 // indirect
+ github.com/goccy/go-json v0.10.5 // indirect
+ github.com/gogo/googleapis v1.4.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
+ github.com/golang-migrate/migrate/v4 v4.7.0 // indirect
github.com/golang/protobuf v1.5.4 // indirect
+ github.com/google/btree v1.1.3 // indirect
+ github.com/google/flatbuffers v25.2.10+incompatible // indirect
github.com/google/gnostic-models v0.6.9 // indirect
github.com/google/go-cmp v0.7.0 // indirect
- github.com/google/gofuzz v1.2.0 // indirect
github.com/google/uuid v1.6.0 // indirect
- github.com/grafana/authlib v0.0.0-20250515162837-2f4a8263eabb // indirect
- github.com/grafana/grafana-app-sdk/logging v0.38.2 // indirect
- github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect
+ github.com/gorilla/mux v1.8.1 // indirect
+ github.com/grafana/alerting v0.0.0-20250725130805-615c8286e14b // indirect
+ github.com/grafana/authlib v0.0.0-20250710201142-9542f2f28d43 // indirect
+ github.com/grafana/authlib/types v0.0.0-20250710201142-9542f2f28d43 // indirect
+ github.com/grafana/dataplane/sdata v0.0.9 // indirect
+ github.com/grafana/dskit v0.0.0-20250611075409-46f51e1ce914 // indirect
+ github.com/grafana/grafana-app-sdk/logging v0.39.3 // indirect
+ github.com/grafana/grafana-aws-sdk v1.0.4 // indirect
+ github.com/grafana/grafana-azure-sdk-go/v2 v2.1.6 // indirect
+ github.com/grafana/grafana-plugin-sdk-go v0.278.0 // indirect
+ github.com/grafana/grafana/pkg/apiserver v0.0.0-20250627191313-2f1a6ae1712b // indirect
+ github.com/grafana/otel-profiling-go v0.5.1 // indirect
+ github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect
+ github.com/grafana/sqlds/v4 v4.2.3 // indirect
+ github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0 // indirect
+ github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 // indirect
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
+ github.com/hashicorp/go-hclog v1.6.3 // indirect
+ github.com/hashicorp/go-immutable-radix v1.3.1 // indirect
+ github.com/hashicorp/go-metrics v0.5.4 // indirect
+ github.com/hashicorp/go-msgpack/v2 v2.1.2 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
+ github.com/hashicorp/go-plugin v1.6.3 // indirect
+ github.com/hashicorp/go-sockaddr v1.0.7 // indirect
+ github.com/hashicorp/golang-lru v1.0.2 // indirect
+ github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
+ github.com/hashicorp/memberlist v0.5.2 // indirect
+ github.com/hashicorp/yamux v0.1.1 // indirect
+ github.com/jaegertracing/jaeger-idl v0.5.0 // indirect
+ github.com/jmespath-community/go-jmespath v1.1.1 // indirect
+ github.com/jmoiron/sqlx v1.3.5 // indirect
github.com/josharian/intern v1.0.0 // indirect
+ github.com/jpillora/backoff v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
+ github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 // indirect
github.com/klauspost/compress v1.18.0 // indirect
- github.com/mailru/easyjson v0.7.7 // indirect
+ github.com/klauspost/cpuid/v2 v2.2.10 // indirect
+ github.com/lib/pq v1.10.9 // indirect
+ github.com/magefile/mage v1.15.0 // indirect
+ github.com/mailru/easyjson v0.9.0 // indirect
+ github.com/mattetti/filebuffer v1.0.1 // indirect
+ github.com/mattn/go-colorable v0.1.14 // indirect
+ github.com/mattn/go-isatty v0.0.20 // indirect
+ github.com/mattn/go-runewidth v0.0.16 // indirect
+ github.com/mattn/go-sqlite3 v1.14.22 // indirect
+ github.com/mdlayher/socket v0.4.1 // indirect
+ github.com/mdlayher/vsock v1.2.1 // indirect
+ github.com/miekg/dns v1.1.63 // indirect
+ github.com/mitchellh/go-homedir v1.1.0 // indirect
+ github.com/mithrandie/csvq v1.18.1 // indirect
+ github.com/mithrandie/csvq-driver v1.7.0 // indirect
+ github.com/mithrandie/go-file/v2 v2.1.0 // indirect
+ github.com/mithrandie/go-text v1.6.0 // indirect
+ github.com/mithrandie/ternary v1.1.1 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
+ github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // indirect
github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect
github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect
- github.com/onsi/ginkgo/v2 v2.22.2 // indirect
- github.com/onsi/gomega v1.36.2 // indirect
- github.com/openfga/openfga v1.8.13 // indirect
+ github.com/oklog/run v1.1.0 // indirect
+ github.com/oklog/ulid v1.3.1 // indirect
+ github.com/olekukonko/tablewriter v0.0.5 // indirect
+ github.com/open-feature/go-sdk v1.14.1 // indirect
+ github.com/open-feature/go-sdk-contrib/providers/go-feature-flag v0.2.3 // indirect
+ github.com/open-feature/go-sdk-contrib/providers/ofrep v0.1.5 // indirect
+ github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
github.com/perimeterx/marshmallow v1.1.5 // indirect
+ github.com/pierrec/lz4/v4 v4.1.22 // indirect
+ github.com/pkg/errors v0.9.1 // indirect
+ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
+ github.com/prometheus/alertmanager v0.28.0 // indirect
github.com/prometheus/client_golang v1.22.0 // indirect
- github.com/prometheus/client_model v0.6.1 // indirect
- github.com/prometheus/common v0.63.0 // indirect
+ github.com/prometheus/client_model v0.6.2 // indirect
+ github.com/prometheus/common v0.65.0 // indirect
+ github.com/prometheus/exporter-toolkit v0.14.0 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/puzpuzpuz/xsync/v2 v2.5.1 // indirect
- github.com/rogpeppe/go-internal v1.14.1 // indirect
+ github.com/rivo/uniseg v0.4.7 // indirect
+ github.com/russross/blackfriday/v2 v2.1.0 // indirect
+ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect
github.com/spf13/pflag v1.0.6 // indirect
+ github.com/stretchr/objx v0.5.2 // indirect
+ github.com/tjhop/slog-gokit v0.1.3 // indirect
+ github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8 // indirect
+ github.com/unknwon/com v1.0.1 // indirect
+ github.com/unknwon/log v0.0.0-20200308114134-929b1006e34a // indirect
+ github.com/urfave/cli v1.22.16 // indirect
github.com/x448/float16 v0.8.4 // indirect
+ github.com/zeebo/xxh3 v1.0.2 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
- go.opentelemetry.io/otel v1.36.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.36.0 // indirect
- go.opentelemetry.io/otel/metric v1.36.0 // indirect
- go.opentelemetry.io/otel/sdk v1.36.0 // indirect
- go.opentelemetry.io/otel/trace v1.36.0 // indirect
- go.opentelemetry.io/proto/otlp v1.6.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect
+ go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.61.0 // indirect
+ go.opentelemetry.io/contrib/propagators/jaeger v1.36.0 // indirect
+ go.opentelemetry.io/contrib/samplers/jaegerremote v0.30.0 // indirect
+ go.opentelemetry.io/otel v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0 // indirect
+ go.opentelemetry.io/otel/metric v1.37.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.37.0 // indirect
+ go.opentelemetry.io/otel/trace v1.37.0 // indirect
+ go.opentelemetry.io/proto/otlp v1.7.0 // indirect
+ go.uber.org/atomic v1.11.0 // indirect
+ go.yaml.in/yaml/v2 v2.4.2 // indirect
golang.org/x/crypto v0.39.0 // indirect
+ golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect
+ golang.org/x/mod v0.25.0 // indirect
golang.org/x/net v0.41.0 // indirect
- golang.org/x/oauth2 v0.29.0 // indirect
- golang.org/x/sync v0.15.0 // indirect
+ golang.org/x/oauth2 v0.30.0 // indirect
+ golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.33.0 // indirect
golang.org/x/term v0.32.0 // indirect
golang.org/x/text v0.26.0 // indirect
golang.org/x/time v0.11.0 // indirect
golang.org/x/tools v0.34.0 // indirect
+ golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect
gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect
- google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 // indirect
- google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 // indirect
+ google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect
+ google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
google.golang.org/grpc v1.73.0 // indirect
google.golang.org/protobuf v1.36.6 // indirect
+ gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
+ gopkg.in/ini.v1 v1.67.0 // indirect
+ gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
- k8s.io/api v0.33.1 // indirect
- k8s.io/apiextensions-apiserver v0.33.1 // indirect
- k8s.io/client-go v0.33.1 // indirect
- k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
- sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
+ k8s.io/api v0.33.3 // indirect
+ k8s.io/apiextensions-apiserver v0.33.2 // indirect
+ k8s.io/client-go v0.33.3 // indirect
+ k8s.io/component-base v0.33.3 // indirect
+ k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect
+ sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect
- sigs.k8s.io/yaml v1.4.0 // indirect
+ sigs.k8s.io/yaml v1.5.0 // indirect
+ xorm.io/builder v0.3.6 // indirect
)
diff --git a/apps/investigations/go.sum b/apps/investigations/go.sum
index fbf07786493..903c4ae9e07 100644
--- a/apps/investigations/go.sum
+++ b/apps/investigations/go.sum
@@ -1,279 +1,993 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+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=
+cuelang.org/go v0.11.1 h1:pV+49MX1mmvDm8Qh3Za3M786cty8VKPWzQ1Ho4gZRP0=
+cuelang.org/go v0.11.1/go.mod h1:PBY6XvPUswPPJ2inpvUozP9mebDVTXaeehQikhZPBz0=
+dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s=
+dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
+filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
+filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
+github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U=
+github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0 h1:OVoM452qUFBrX+URdH3VpR299ma4kfom0yB0URYky9g=
+github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0/go.mod h1:kUjrAo8bgEwLeZ/CmHqNl3Z/kPm7y6FKfxxK0izYUg4=
+github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4=
+github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA=
+github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8=
+github.com/Azure/go-ntlmssp v0.0.0-20220621081337-cb9428e4ac1e h1:NeAW1fUYUEWhft7pkxDf6WoUvEZJ/uOKsvtpjLnn8MU=
+github.com/Azure/go-ntlmssp v0.0.0-20220621081337-cb9428e4ac1e/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
+github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs=
+github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
+github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg=
+github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
+github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ=
+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.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww=
+github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y=
+github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
+github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
+github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs=
+github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0=
+github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA=
+github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=
+github.com/ProtonMail/go-crypto v1.1.6 h1:ZcV+Ropw6Qn0AX9brlQLAUXfqLBc7Bl+f/DmNxpLfdw=
+github.com/ProtonMail/go-crypto v1.1.6/go.mod h1:rA3QumHc/FZ8pAHreoekgiAbzpNsfQAosU5td4SnOrE=
+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/mysqlerr v0.0.0-20170204212430-6c6b55f8796f h1:HR5nRmUQgXrwqZOwZ2DAc/aCi3Bu3xENpspW935vxu0=
+github.com/VividCortex/mysqlerr v0.0.0-20170204212430-6c6b55f8796f/go.mod h1:f3HiCrHjHBdcm6E83vGaXh1KomZMA2P6aeo3hKx/wg0=
+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=
+github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
+github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0=
+github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs=
+github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA=
+github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA=
+github.com/apache/arrow-go/v18 v18.3.0 h1:Xq4A6dZj9Nu33sqZibzn012LNnewkTUlfKVUFD/RX/I=
+github.com/apache/arrow-go/v18 v18.3.0/go.mod h1:eEM1DnUTHhgGAjf/ChvOAQbUQ+EPohtDrArffvUjPg8=
+github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
+github.com/apache/thrift v0.21.0 h1:tdPmh/ptjE1IJnhbhrcl2++TauVjy242rkV/UzJChnE=
+github.com/apache/thrift v0.21.0/go.mod h1:W1H8aR/QRtYNvrPeFXBtobyRkd0/YVhTc6i07XIAgDw=
+github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJA=
+github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4=
+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/at-wat/mqtt-go v0.19.4 h1:R2cbCU7O5PHQ38unbe1Y51ncG3KsFEJV6QeipDoqdLQ=
+github.com/at-wat/mqtt-go v0.19.4/go.mod h1:AsiWc9kqVOhqq7LzUeWT/AkKUBfx3Sw5cEe8lc06fqA=
+github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
+github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE=
+github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
+github.com/aws/aws-sdk-go-v2 v1.36.5 h1:0OF9RiEMEdDdZEMqF9MRjevyxAQcf6gY+E7vwBILFj0=
+github.com/aws/aws-sdk-go-v2 v1.36.5/go.mod h1:EYrzvCCN9CMUTa5+6lf6MM4tq3Zjp8UhSGR/cBsjai0=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.70 h1:ONnH5CM16RTXRkS8Z1qg7/s2eDOhHhaXVd72mmyv4/0=
+github.com/aws/aws-sdk-go-v2/credentials v1.17.70/go.mod h1:M+lWhhmomVGgtuPOhO85u4pEa3SmssPTdcYpP/5J/xc=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36 h1:SsytQyTMHMDPspp+spo7XwXTP44aJZZAC7fBV2C5+5s=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.36/go.mod h1:Q1lnJArKRXkenyog6+Y+zr7WDpk4e6XlR6gs20bbeNo=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36 h1:i2vNHQiXUvKhs3quBR6aqlgJaiaexz/aNvdCktW/kAM=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.36/go.mod h1:UdyGa7Q91id/sdyHPwth+043HhmP6yP9MBHgbZM0xo8=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4 h1:CXV68E2dNqhuynZJPB80bhPQwAKqBWVer887figW6Jc=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.4/go.mod h1:/xFi9KtvBXP97ppCz1TAEvU1Uf66qvid89rbem3wCzQ=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17 h1:t0E6FzREdtCsiLIoLCWsYliNsRBgyGD/MCK571qk4MI=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.17/go.mod h1:ygpklyoaypuyDvOM5ujWGrYWpAK3h7ugnmKCU/76Ys4=
+github.com/aws/aws-sdk-go-v2/service/sts v1.34.0 h1:NFOJ/NXEGV4Rq//71Hs1jC/NvPs1ezajK+yQmkwnPV0=
+github.com/aws/aws-sdk-go-v2/service/sts v1.34.0/go.mod h1:7ph2tGpfQvwzgistp2+zga9f+bCjlQJPkPUmMgDSD7w=
+github.com/aws/smithy-go v1.22.4 h1:uqXzVZNuNexwc/xrh6Tb56u89WDlJY6HS+KC0S4QSjw=
+github.com/aws/smithy-go v1.22.4/go.mod h1:t1ufH5HMublsJYulve2RKmHDC15xu1f26kHCp/HgceI=
+github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
+github.com/benbjohnson/clock v1.3.5/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
+github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k=
+github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM=
+github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ=
+github.com/bluele/gcache v0.0.2 h1:WcbfdXICg7G/DGBh1PFfcirkWOQV+v077yF1pSy3DGw=
+github.com/bluele/gcache v0.0.2/go.mod h1:m15KV+ECjptwSPxKhOhQoAFQVtUFjTVkc3H8o0t/fp0=
+github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 h1:N7oVaKyGp8bttX0bfZGmcGkjz7DLQXhAn3DNd3T0ous=
github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874/go.mod h1:r5xuitiExdLAJ09PR7vBVENGvp4ZuTBeWTGtxuX3K+c=
+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/bwmarrin/snowflake v0.3.0 h1:xm67bEhkKh6ij1790JB83OujPR5CzNe8QuQqAgISZN0=
+github.com/bwmarrin/snowflake v0.3.0/go.mod h1:NdZxfVWX+oR6y2K0o6qAYv6gIOP9rjG0/E9WsDpxqwE=
github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8=
github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
+github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8=
+github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
+github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE=
+github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ=
+github.com/chromedp/cdproto v0.0.0-20250429231605-6ed5b53462d4 h1:UZdrvid2JFwnvPlUSEFlE794XZL4Jmrj8fuxfcLECJE=
+github.com/chromedp/cdproto v0.0.0-20250429231605-6ed5b53462d4/go.mod h1:NItd7aLkcfOA/dcMXvl8p1u+lQqioRMq/SqDp71Pb/k=
+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/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/cloudflare/circl v1.6.1 h1:zqIqSPIndyBh1bjLVVDHMPpVKqp8Su/V+6MeDzzQBQ0=
+github.com/cloudflare/circl v1.6.1/go.mod h1:uddAzsPgqdMAYatqJ0lsjX1oECcQLIlRpzZh3pJrofs=
+github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
+github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
+github.com/cockroachdb/apd/v3 v3.2.1 h1:U+8j7t0axsIgvQUqthuNm82HIrYXodOV2iWLWtEaIwg=
+github.com/cockroachdb/apd/v3 v3.2.1/go.mod h1:klXJcjp+FffLTHlhIG69tezTDvdP065naDsHzKhYSqc=
+github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c/go.mod h1:XGLbWH/ujMcbPbhZq52Nv6UrCghb1yGn//133kEsvDk=
+github.com/containerd/containerd v1.2.7/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA=
+github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs=
+github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
+github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
+github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0=
+github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
+github.com/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=
+github.com/cznic/internal v0.0.0-20180608152220-f44710a21d00/go.mod h1:olo7eAdKwJdXxb55TKGLiJ6xt1H0/tiiRCWKVLmtjY4=
+github.com/cznic/lldb v1.1.0/go.mod h1:FIZVUmYUVhPwRiPzL8nD/mpFcJ/G7SSXjjXYG4uRI3A=
+github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM=
+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/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/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
-github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3/go.mod h1:zAg7JM8CkOJ43xKXIj7eRO9kmWm/TW578qo+oDO6tuM=
+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/dhui/dktest v0.3.0/go.mod h1:cyzIUfGsBEbZ6BT7tnXqAShHSXCZhSNmFl70sZ7c1yc=
+github.com/dlmiddlecote/sqlstats v1.0.2 h1:gSU11YN23D/iY50A2zVYwgXgy072khatTsIW6UPjUtI=
+github.com/dlmiddlecote/sqlstats v1.0.2/go.mod h1:0CWaIh/Th+z2aI6Q9Jpfg/o21zmGxWhbByHgQSCUQvY=
+github.com/docker/distribution v2.7.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w=
+github.com/docker/docker v0.7.3-0.20190103212154-2b7e084dc98b/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/docker v0.7.3-0.20190817195342-4760db040282/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
+github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
+github.com/docker/go-units v0.3.3/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
+github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
+github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
+github.com/dolthub/flatbuffers/v23 v23.3.3-dh.2 h1:u3PMzfF8RkKd3lB9pZ2bfn0qEG+1Gms9599cr0REMww=
+github.com/dolthub/flatbuffers/v23 v23.3.3-dh.2/go.mod h1:mIEZOHnFx4ZMQeawhw9rhsj+0zwQj7adVsnBX7t+eKY=
+github.com/dolthub/go-icu-regex v0.0.0-20250327004329-6799764f2dad h1:66ZPawHszNu37VPQckdhX1BPPVzREsGgNxQeefnlm3g=
+github.com/dolthub/go-icu-regex v0.0.0-20250327004329-6799764f2dad/go.mod h1:ylU4XjUpsMcvl/BKeRRMXSH7e7WBrPXdSLvnRJYrxEA=
+github.com/dolthub/go-mysql-server v0.19.1-0.20250410182021-5632d67cd46e h1:7pAttAqWaudUAsM9iHASi/4eFBK+qn4qeaNto7g8bK4=
+github.com/dolthub/go-mysql-server v0.19.1-0.20250410182021-5632d67cd46e/go.mod h1:KZyoO3jngyZCLyCf100FEQTrwAHj33AIMj4Zv4u3MNE=
+github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71 h1:bMGS25NWAGTEtT5tOBsCuCrlYnLRKpbJVJkDbrTRhwQ=
+github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71/go.mod h1:2/2zjLQ/JOOSbbSboojeg+cAwcRV0fDLzIiWch/lhqI=
+github.com/dolthub/vitess v0.0.0-20250410090211-143e6b272ad4 h1:LGTt2LtYX8vaai32d+c9L0sMcP+Dg9w1kO6+lbsxxYg=
+github.com/dolthub/vitess v0.0.0-20250410090211-143e6b272ad4/go.mod h1:1gQZs/byeHLMSul3Lvl3MzioMtOW1je79QYGyi2fd70=
+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/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
+github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o=
+github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE=
+github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU=
+github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
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/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk=
+github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
+github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
+github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
+github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k=
+github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0=
+github.com/fsouza/fake-gcs-server v1.7.0/go.mod h1:5XIRs4YvwNbNoz+1JF8j6KLAyDh7RHGAyAK3EP2EsNk=
github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
-github.com/getkin/kin-openapi v0.131.0 h1:NO2UeHnFKRYhZ8wg6Nyh5Cq7dHk4suQQr72a4pMrDxE=
-github.com/getkin/kin-openapi v0.131.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58=
+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.132.0 h1:3ISeLMsQzcb5v26yeJrBcdTCEQTag36ZjaGk7MIRUwk=
github.com/getkin/kin-openapi v0.132.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58=
+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-jose/go-jose/v3 v3.0.4 h1:Wp5HA7bLQcKnf6YYao/4kpRpVMp/yf6+pJKV8WFSaNY=
+github.com/go-jose/go-jose/v3 v3.0.4/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
+github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU=
+github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0=
+github.com/go-ldap/ldap/v3 v3.4.4 h1:qPjipEpt+qDa6SI/h1fzuGWoRUY+qqQ9sOZq67/PYUs=
+github.com/go-ldap/ldap/v3 v3.4.4/go.mod h1:fe1MsuN5eJJ1FeLT/LEBVdWfNWKh459R7aXgXtJC+aI=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
+github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4=
+github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
-github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
+github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-openapi/analysis v0.23.0 h1:aGday7OWupfMs+LbmLZG4k0MYXIANxcuBTYUC03zFCU=
+github.com/go-openapi/analysis v0.23.0/go.mod h1:9mz9ZWaSlV8TvjQHLl2mUW2PbZtemkE8yA5v22ohupo=
+github.com/go-openapi/errors v0.22.0 h1:c4xY/OLxUBSTiepAg3j/MHuAv5mJhnf53LLMWFB+u/w=
+github.com/go-openapi/errors v0.22.0/go.mod h1:J3DmZScxCDufmIMsdOuDHxJbdOGC0xtUynjIx092vXE=
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY=
github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ=
github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4=
+github.com/go-openapi/loads v0.22.0 h1:ECPGd4jX1U6NApCGG1We+uEozOAvXvJSF4nnwHZ8Aco=
+github.com/go-openapi/loads v0.22.0/go.mod h1:yLsaTCS92mnSAZX5WWoxszLj0u+Ojl+Zs5Stn1oF+rs=
+github.com/go-openapi/runtime v0.28.0 h1:gpPPmWSNGo214l6n8hzdXYhPuJcGtziTOgUpvsFWGIQ=
+github.com/go-openapi/runtime v0.28.0/go.mod h1:QN7OzcS+XuYmkQLw05akXk0jRH/eZ3kb18+1KwW9gyc=
+github.com/go-openapi/spec v0.21.0 h1:LTVzPc3p/RzRnkQqLRndbAzjY0d0BCL72A6j3CdL9ZY=
+github.com/go-openapi/spec v0.21.0/go.mod h1:78u6VdPw81XU44qEWGhtr982gJ5BWg2c0I5XwVMotYk=
+github.com/go-openapi/strfmt v0.23.0 h1:nlUS6BCqcnAk0pyhi9Y+kdDVZdZMHfEKQiS4HaMgO/c=
+github.com/go-openapi/strfmt v0.23.0/go.mod h1:NrtIpfKtWIygRkKVsxh7XQMDQW5HKQl6S5ik2elW+K4=
github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE=
github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ=
+github.com/go-openapi/validate v0.24.0 h1:LdfDKwNbpB6Vn40xhTdNZAnfLECL81w+VX3BumrGD58=
+github.com/go-openapi/validate v0.24.0/go.mod h1:iyeX1sEufmv3nPbBdX3ieNviWnOZaJ1+zquzJEf2BAQ=
+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-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
+github.com/go-sql-driver/mysql v1.9.2 h1:4cNKDYQ1I84SXslGddlsrMhc8k4LeDVj6Ad6WRjiHuU=
+github.com/go-sql-driver/mysql v1.9.2/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw=
+github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM=
github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE=
-github.com/go-viper/mapstructure/v2 v2.3.0 h1:27XbWsHIqhbdR5TIC911OfYvgSaW93HM+dX7970Q7jk=
-github.com/go-viper/mapstructure/v2 v2.3.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
+github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:9wScpmSP5A3Bk8V3XHWUcJmYTh+ZnlHVyc+A4oZYS3Y=
+github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM=
+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/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
+github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
+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 v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA=
+github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
+github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0=
+github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+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/golang-jwt/jwt/v4 v4.5.2 h1:YtQM7lnr8iZ+j5q71MGKkNw9Mn7AjHM68uc9g5fXeUI=
+github.com/golang-jwt/jwt/v4 v4.5.2/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
+github.com/golang-jwt/jwt/v5 v5.2.2 h1:Rl4B7itRWVtYIHFrSNd7vhTiz9UpLdi6gZhZ3wEeDy8=
+github.com/golang-jwt/jwt/v5 v5.2.2/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/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/mock v1.7.0-rc.1 h1:YojYx61/OLFsiv6Rw1Z96LpldJIy31o+UHmwAUMJ6/U=
+github.com/golang/mock v1.7.0-rc.1/go.mod h1:s42URUywIqd+OcERslBJvOjepvNymP31m3q8d/GkuRs=
+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=
+github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
+github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
+github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
+github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
+github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
+github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
+github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
+github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs=
+github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg=
+github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
+github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q=
+github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8=
github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw=
github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
+github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
+github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
+github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ=
+github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
-github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
-github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad h1:a6HEuzUHeKH6hwfN/ZoQgRgVIWFJljSWa/zetS2WTvg=
-github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
+github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
+github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
+github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8=
+github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/grafana/authlib v0.0.0-20250515162837-2f4a8263eabb h1:oTl2j6/4miQUYmXANp2pBuYCWA5f8NVYFfCWpczpFso=
-github.com/grafana/authlib v0.0.0-20250515162837-2f4a8263eabb/go.mod h1:PBtQaXwkFu4BAt2aXsR7w8p8NVpdjV5aJYhqRDei9Us=
-github.com/grafana/grafana-app-sdk v0.35.1 h1:zEXubzsQrxGBOzXJJMBwhEClC/tvPi0sfK7NGmlX3RI=
-github.com/grafana/grafana-app-sdk v0.35.1/go.mod h1:Zx5MkVppYK+ElSDUAR6+fjzOVo6I/cIgk+ty+LmNOxI=
-github.com/grafana/grafana-app-sdk v0.39.0/go.mod h1:xRyBQOttgWTc3tGe9pI0upnpEPVhzALf7Mh/61O4zyY=
-github.com/grafana/grafana-app-sdk/logging v0.35.1 h1:taVpl+RoixTYl0JBJGhH+fPVmwA9wvdwdzJTZsv9buM=
-github.com/grafana/grafana-app-sdk/logging v0.35.1/go.mod h1:Y/bvbDhBiV/tkIle9RW49pgfSPIPSON8Q4qjx3pyqDk=
-github.com/grafana/grafana-app-sdk/logging v0.38.2/go.mod h1:Y/bvbDhBiV/tkIle9RW49pgfSPIPSON8Q4qjx3pyqDk=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI=
+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/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
+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.1/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs=
+github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY=
+github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ=
+github.com/grafana/alerting v0.0.0-20250725130805-615c8286e14b h1:mfUAq/N+mS82EcE35hDXWtfVY7UhTjzZxzssvFt9tvQ=
+github.com/grafana/alerting v0.0.0-20250725130805-615c8286e14b/go.mod h1:VKxaR93Gff0ZlO2sPcdPVob1a/UzArFEW5zx3Bpyhls=
+github.com/grafana/authlib v0.0.0-20250710201142-9542f2f28d43 h1:vVPT0i5Y1vI6qzecYStV2yk7cHKrC3Pc7AgvwT5KydQ=
+github.com/grafana/authlib v0.0.0-20250710201142-9542f2f28d43/go.mod h1:1fWkOiL+m32NBgRHZtlZGz2ji868tPZACYbqP3nBRJI=
+github.com/grafana/authlib/types v0.0.0-20250710201142-9542f2f28d43 h1:NlkGMnVi/oUn6Cr90QbJYpQJ4FnjyAIG9Ex5GtTZIzw=
+github.com/grafana/authlib/types v0.0.0-20250710201142-9542f2f28d43/go.mod h1:qeWYbnWzaYGl88JlL9+DsP1GT2Cudm58rLtx13fKZdw=
+github.com/grafana/dataplane/sdata v0.0.9 h1:AGL1LZnCUG4MnQtnWpBPbQ8ZpptaZs14w6kE/MWfg7s=
+github.com/grafana/dataplane/sdata v0.0.9/go.mod h1:Jvs5ddpGmn6vcxT7tCTWAZ1mgi4sbcdFt9utQx5uMAU=
+github.com/grafana/dskit v0.0.0-20250611075409-46f51e1ce914 h1:qcSGhr691f1mmPHwg2svGyO40Ex92G02aOyHzP6XHCE=
+github.com/grafana/dskit v0.0.0-20250611075409-46f51e1ce914/go.mod h1:OiN4P4aC6LwLzLbEupH3Ue83VfQoNMfG48rsna8jI/E=
+github.com/grafana/grafana-app-sdk v0.40.0 h1:KilbCFMYox2cnIi1W6ql7W+n9kms/NvWlBPM1m4Q4mg=
+github.com/grafana/grafana-app-sdk v0.40.0/go.mod h1:fn943JEM0CR3mY/Gd3816MUcpob5xnKc8MoojnbMjYY=
+github.com/grafana/grafana-app-sdk/logging v0.39.3 h1:mMrcYahnoRu7blKyL/ZVcgv7WCiI2CqxODYh8tBFUgY=
+github.com/grafana/grafana-app-sdk/logging v0.39.3/go.mod h1:otUD9XpJD7A5sCLb8mcs9hIXGdeV6lnhzVwe747g4RU=
+github.com/grafana/grafana-aws-sdk v1.0.4 h1:D14UAehsOqpjliHmHzveRQ1p43KCsMzdmb7GovWj+SY=
+github.com/grafana/grafana-aws-sdk v1.0.4/go.mod h1:hO7q7yWV+t6dmiyJjMa3IbuYnYkBua+G/IAlOPVIYKE=
+github.com/grafana/grafana-azure-sdk-go/v2 v2.1.6 h1:OfCkitCuomzZKW1WYHrG8MxKwtMhALb7jqoj+487eTg=
+github.com/grafana/grafana-azure-sdk-go/v2 v2.1.6/go.mod h1:V7y2BmsWxS3A9Ohebwn4OiSfJJqi//4JQydQ8fHTduo=
+github.com/grafana/grafana-plugin-sdk-go v0.278.0 h1:5/rIYparLi02pofdaag8wnjspMMVNCi8cZhC4cdC3Ho=
+github.com/grafana/grafana-plugin-sdk-go v0.278.0/go.mod h1:+8NXT/XUJ/89GV6FxGQ366NZ3nU+cAXDMd0OUESF9H4=
+github.com/grafana/grafana/apps/dashboard v0.0.0-20250716132114-6fd75ebc5441 h1:+TSbaxCXBZrKkdROWBzdWna8uStE1f9LYd7GiqjVfz8=
+github.com/grafana/grafana/apps/dashboard v0.0.0-20250716132114-6fd75ebc5441/go.mod h1:1XWiRSVuDQiayapHhQiDc4S4e9GzEZgg/3GeNCuDgn4=
+github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250725152715-69d3b9023cec h1:cg1GbDVZ7goqDrqoMzqeN4AeAcD271MGYjOvdVTDwfw=
+github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250725152715-69d3b9023cec/go.mod h1:3ZgUe0E3rIhI026xF4DKFptOst/jpDHJ/Sn+bRODzI4=
+github.com/grafana/grafana/pkg/apiserver v0.0.0-20250627191313-2f1a6ae1712b h1:QyJLJn3xwFTIXu9KPZujsrIUN0X8DdiR9b2h75L0AfI=
+github.com/grafana/grafana/pkg/apiserver v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:6OKkPWDB8PetDXqMVMOWL35iTCEUdpATwwpuew0k8+o=
+github.com/grafana/otel-profiling-go v0.5.1 h1:stVPKAFZSa7eGiqbYuG25VcqYksR6iWvF3YH66t4qL8=
+github.com/grafana/otel-profiling-go v0.5.1/go.mod h1:ftN/t5A/4gQI19/8MoWurBEtC6gFw8Dns1sJZ9W4Tls=
+github.com/grafana/prometheus-alertmanager v0.25.1-0.20250620093340-be61a673dee6 h1:oJnbhG6ZNy10AjsgNeAtAKeGHogIGOMfAsBH6fYYa5M=
+github.com/grafana/prometheus-alertmanager v0.25.1-0.20250620093340-be61a673dee6/go.mod h1:O/QP1BCm0HHIzbKvgMzqb5sSyH88rzkFk84F4TfJjBU=
+github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg=
+github.com/grafana/pyroscope-go/godeltaprof v0.1.8/go.mod h1:2+l7K7twW49Ct4wFluZD3tZ6e0SjanjcUUBPVD/UuGU=
+github.com/grafana/sqlds/v4 v4.2.3 h1:9ibD1c5O5u9fifEkBSig+jAc41TUEz+M+bWQqDsofP4=
+github.com/grafana/sqlds/v4 v4.2.3/go.mod h1:bv+XHabfUF4xkgg4y+nYFCK8rpMHZsMaQk56qNaJcAM=
+github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0 h1:QGLs/O40yoNK9vmy4rhUGBVyMf1lISBGtXRpsu/Qu/o=
+github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0/go.mod h1:hM2alZsMUni80N33RBe6J0e423LB+odMj7d3EMP9l20=
+github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 h1:sGm2vDRFUrQJO/Veii4h4zG2vvqG6uWNkBHSTqXOZk0=
+github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2/go.mod h1:wd1YpapPLivG6nQgbf7ZkG1hhSOXDhhn4MLTknx2aAc=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90=
+github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
+github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k=
+github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M=
+github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc=
+github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
+github.com/hashicorp/go-metrics v0.5.4 h1:8mmPiIJkTPPEbAiV97IxdAGNdRdaWwVap1BU6elejKY=
+github.com/hashicorp/go-metrics v0.5.4/go.mod h1:CG5yz4NZ/AI/aQt9Ucm/vdBnbh7fvmv4lxZ350i+QQI=
+github.com/hashicorp/go-msgpack/v2 v2.1.2 h1:4Ee8FTp834e+ewB71RDrQ0VKpyFdrKOjvYtnQ/ltVj0=
+github.com/hashicorp/go-msgpack/v2 v2.1.2/go.mod h1:upybraOAblm4S7rx0+jeNy+CWWhzywQsSRV5033mMu4=
+github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
+github.com/hashicorp/go-plugin v1.6.3 h1:xgHB+ZUSYeuJi96WtxEjzi23uh7YQpznjGh0U0UUrwg=
+github.com/hashicorp/go-plugin v1.6.3/go.mod h1:MRobyh+Wc/nYy1V4KAXUiYfzxoYhs7V1mlH1Z7iY2h0=
+github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
+github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw=
+github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw=
+github.com/hashicorp/go-uuid v1.0.0/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/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
+github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c=
+github.com/hashicorp/golang-lru v1.0.2/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/memberlist v0.5.2 h1:rJoNPWZ0juJBgqn48gjy59K5H4rNgvUoM1kUD7bXiuI=
+github.com/hashicorp/memberlist v0.5.2/go.mod h1:Ri9p/tRShbjYnpNf4FFPXG7wxEGY4Nrcn6E7jrVa//4=
+github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE=
+github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/huandu/xstrings v1.5.0 h1:2ag3IFq9ZDANvthTwTiqSSZLjDc+BedvHPAp5tJy2TI=
+github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE=
+github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ=
+github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I=
+github.com/jaegertracing/jaeger-idl v0.5.0 h1:zFXR5NL3Utu7MhPg8ZorxtCBjHrL3ReM1VoB65FOFGE=
+github.com/jaegertracing/jaeger-idl v0.5.0/go.mod h1:ON90zFo9eoyXrt9F/KN8YeF3zxcnujaisMweFY/rg5k=
+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/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c=
+github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo=
+github.com/jmespath-community/go-jmespath v1.1.1 h1:bFikPhsi/FdmlZhVgSCd2jj1e7G/rw+zyQfyg5UF+L4=
+github.com/jmespath-community/go-jmespath v1.1.1/go.mod h1:4gOyFJsR/Gk+05RgTKYrifT7tBPWD8Lubtb5jRrfy9I=
+github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
+github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg=
+github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo=
+github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g=
+github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
+github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA=
+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.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
+github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 h1:SwcnSwBR7X/5EHJQlXBockkJVIMRVt5yKaesBPMtyZQ=
+github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6/go.mod h1:WrYiIuiXUMIvTDAQw97C+9l0CnBmCcvosPjN3XDqS/o=
+github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
+github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
+github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
+github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
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.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo=
github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ=
+github.com/klauspost/cpuid/v2 v2.2.10 h1:tBs3QSyvjDyFTq3uoc/9xFpCuOsJQFNPiAhYdw2skhE=
+github.com/klauspost/cpuid/v2 v2.2.10/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
+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=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
+github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
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/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/kshvakov/clickhouse v1.3.5/go.mod h1:DMzX7FxRymoNkVgizH0DWAL8Cur7wHLgx3MUnGwJqpE=
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/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
-github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/lestrrat-go/strftime v1.0.4 h1:T1Rb9EPkAhgxKqbcMIPguPq8glqXTA1koF8n9BHElA8=
+github.com/lestrrat-go/strftime v1.0.4/go.mod h1:E1nN3pCbtMSu1yjSVeyuRFVm/U0xoR76fd03sz+Qz4g=
+github.com/lib/pq v1.0.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.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
+github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
+github.com/magefile/mage v1.15.0 h1:BvGheCMAsG3bWUDbZ8AyXXpCNwU9u5CB6sM+HNb9HYg=
+github.com/magefile/mage v1.15.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A=
+github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=
+github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
+github.com/mattetti/filebuffer v1.0.1 h1:gG7pyfnSIZCxdoKq+cPa8T0hhYtD9NxCdI4D7PTjRLM=
+github.com/mattetti/filebuffer v1.0.1/go.mod h1:YdMURNDOttIiruleeVr6f56OrMc+MydEnTcXwtkxNVs=
+github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
+github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
+github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
+github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
+github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
+github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc=
+github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
+github.com/mattn/go-sqlite3 v1.10.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.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
+github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
+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/mdlayher/socket v0.4.1 h1:eM9y2/jlbs1M615oshPQOHZzj6R6wMT7bX5NPiQvn2U=
+github.com/mdlayher/socket v0.4.1/go.mod h1:cAqeGjoufqdxWkD7DkpyS+wcefOtmu5OQ8KuoJGIReA=
+github.com/mdlayher/vsock v1.2.1 h1:pC1mTJTvjo1r9n9fbm7S1j04rCgCzhCOS5DY0zqHlnQ=
+github.com/mdlayher/vsock v1.2.1/go.mod h1:NRfCibel++DgeMD8z/hP+PPTjlNJsdPOmxcnENvE+SE=
+github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY=
+github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs=
+github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs=
+github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY=
+github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI=
+github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE=
+github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
+github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
+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.1-0.20231216201459-8508981c8b6c h1:cqn374mizHuIWj+OSJCajGr/phAmuMug9qIX3l9CflE=
+github.com/mitchellh/mapstructure v1.5.1-0.20231216201459-8508981c8b6c/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
+github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
+github.com/mithrandie/csvq v1.18.1 h1:f7NB2scbb7xx2ffPduJ2VtZ85RpWXfvanYskAkGlCBU=
+github.com/mithrandie/csvq v1.18.1/go.mod h1:MRJj7AtcXfk7jhNGxLuJGP3LORmh4lpiPWxQ7VyCRn8=
+github.com/mithrandie/csvq-driver v1.7.0 h1:ejiavXNWwTPMyr3fJFnhcqd1L1cYudA0foQy9cZrqhw=
+github.com/mithrandie/csvq-driver v1.7.0/go.mod h1:HcN3xL9UCJnBYA/AIQOOB/KlyfXAiYr5yxDmiwrGk5o=
+github.com/mithrandie/go-file/v2 v2.1.0 h1:XA5Tl+73GXMDvgwSE3Sg0uC5FkLr3hnXs8SpUas0hyg=
+github.com/mithrandie/go-file/v2 v2.1.0/go.mod h1:9YtTF3Xo59GqC1Pxw6KyGVcM/qubAMlxVsqI/u9r++c=
+github.com/mithrandie/go-text v1.6.0 h1:8gOXTMPbMY8DJbKMTv8kHhADcJlDWXqS/YQH4SyWO6s=
+github.com/mithrandie/go-text v1.6.0/go.mod h1:xCgj1xiNbI/d4xA9sLVvXkjh5B2tNx2ZT2/3rpmh8to=
+github.com/mithrandie/ternary v1.1.1 h1:k/joD6UGVYxHixYmSR8EGgDFNONBMqyD373xT4QRdC4=
+github.com/mithrandie/ternary v1.1.1/go.mod h1:0D9Ba3+09K2TdSZO7/bFCC0GjSXetCvYuYq0u8FY/1g=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
+github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU=
+github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8/go.mod h1:86wM1zFnC6/uDBfZGNwB65O+pR2OFi5q/YQaEUid1qA=
github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 h1:G7ERwszslrBzRxj//JalHPu/3yz+De2J+4aLtSRlHiY=
github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037/go.mod h1:2bpvgLBZEtENV5scfDFEtB/5+1M4hkQhDQrccEJ/qGw=
github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 h1:bQx3WeLcUWy+RletIKwUIt4x3t8n2SxavmoclizMb8c=
github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o=
+github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA=
+github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU=
+github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4=
+github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
+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 h1:WSHQ+IS43OoUrWtD1/bbclrwK8TTH5hzp+umCiuxHgs=
+github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU=
github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk=
+github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8=
github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY=
-github.com/openfga/openfga v1.8.12 h1:xEirA6tFwaJfjBDtbHWCK0/Tw+B8XleRyhg9dcEpzHo=
-github.com/openfga/openfga v1.8.12/go.mod h1:fIZyekdNB+tWQ6zIiglZonAc5ErZiDGMeHue/BzRYRM=
-github.com/openfga/openfga v1.8.13 h1:ROURkotKhbmtyBX3188+cNElN8AOZmTl0CMkxUqwawo=
-github.com/openfga/openfga v1.8.13/go.mod h1:h1VGcVW81eY1YyDtFx5+gxxAIEhIiOGR9SRGgs/X/k8=
+github.com/open-feature/go-sdk v1.14.1 h1:jcxjCIG5Up3XkgYwWN5Y/WWfc6XobOhqrIwjyDBsoQo=
+github.com/open-feature/go-sdk v1.14.1/go.mod h1:t337k0VB/t/YxJ9S0prT30ISUHwYmUd/jhUZgFcOvGg=
+github.com/open-feature/go-sdk-contrib/providers/go-feature-flag v0.2.3 h1:6jpO63NCEZv4xunJj+aNlDuFVuRkVBPMcIuxvFPYRWQ=
+github.com/open-feature/go-sdk-contrib/providers/go-feature-flag v0.2.3/go.mod h1:dPUHjAIFzg+ci/wt6XxlNiiMkOh5Yw4SGyeRY0AFT0g=
+github.com/open-feature/go-sdk-contrib/providers/ofrep v0.1.5 h1:ZdqlGnNwhWf3luhBQlIpbglvcCzjkcuEgOEhYhr5Emc=
+github.com/open-feature/go-sdk-contrib/providers/ofrep v0.1.5/go.mod h1:jrD4UG3ZCzuwImKHlyuIN2iWeYjlOX5+zJ/sX45efuE=
+github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s=
+github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0=
+github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw=
+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/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M=
+github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc=
github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s=
github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw=
+github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY=
+github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU=
+github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
+github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
+github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
+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=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
-github.com/prometheus/client_golang v1.21.1 h1:DOvXXTqVzvkIewV/CDPFdejpMCGeMcbGCQ8YOmu+Ibk=
-github.com/prometheus/client_golang v1.21.1/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg=
+github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs=
+github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
+github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU=
+github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M=
+github.com/prometheus/client_golang v1.11.1/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0=
+github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q=
github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
-github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
-github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
-github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k=
-github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18=
-github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
-github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
-github.com/prometheus/procfs v0.16.0/go.mod h1:8veyXUu3nGP7oaCxhX6yeaM5u4stL2FeMXnCqhDthZg=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
+github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
+github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4=
+github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo=
+github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc=
+github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE=
+github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
+github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4=
+github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI=
+github.com/prometheus/exporter-toolkit v0.14.0 h1:NMlswfibpcZZ+H0sZBiTjrA3/aBFHkNZqE+iCj5EmRg=
+github.com/prometheus/exporter-toolkit v0.14.0/go.mod h1:Gu5LnVvt7Nr/oqTBUC23WILZepW0nffNo10XdhQcwWA=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/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.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+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=
+github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
github.com/puzpuzpuz/xsync/v2 v2.5.1 h1:mVGYAvzDSu52+zaGyNjC+24Xw2bQi3kTr4QJ6N9pIIU=
github.com/puzpuzpuz/xsync/v2 v2.5.1/go.mod h1:gD2H2krq/w52MfPLE+Uy64TzJDVY7lP2znR9qmR35kU=
+github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
+github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=
+github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ=
+github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
+github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA=
+github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
+github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0=
+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/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4=
+github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
+github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
+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/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.2.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.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88=
+github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
+github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
+github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304 h1:Jpy1PXuP99tXNrhbq2BaPz9B+jNAvH1JPQQpG/9GCXY=
+github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c h1:Ho+uVpkel/udgjbwB5Lktg9BtvJSh2DT0Hi6LPSyI2w=
+github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s=
+github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y=
+github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o=
github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY=
+github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/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/tetratelabs/wazero v1.8.2 h1:yIgLR/b2bN31bjxwXHD8a3d+BogigR952csSDdLYEv4=
+github.com/tetratelabs/wazero v1.8.2/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs=
+github.com/tidwall/pretty v0.0.0-20180105212114-65a9db5fad51/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
+github.com/tjhop/slog-gokit v0.1.3 h1:6SdexP3UIeg93KLFeiM1Wp1caRwdTLgsD/THxBUy1+o=
+github.com/tjhop/slog-gokit v0.1.3/go.mod h1:Bbu5v2748qpAWH7k6gse/kw3076IJf6owJmh7yArmJs=
+github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM=
github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU=
github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
+github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8 h1:aVGB3YnaS/JNfOW3tiHIlmNmTDg618va+eT0mVomgyI=
+github.com/unknwon/bra v0.0.0-20200517080246-1e3013ecaff8/go.mod h1:fVle4kNr08ydeohzYafr20oZzbAkhQT39gKK/pFQ5M4=
+github.com/unknwon/com v1.0.1 h1:3d1LTxD+Lnf3soQiD4Cp/0BRB+Rsa/+RTvz8GMMzIXs=
+github.com/unknwon/com v1.0.1/go.mod h1:tOOxU81rwgoCLoOVVPHb6T/wt8HZygqH5id+GNnlCXM=
+github.com/unknwon/log v0.0.0-20150304194804-e617c87089d3/go.mod h1:1xEUf2abjfP92w2GZTV+GgaRxXErwRXcClbUwrNJffU=
+github.com/unknwon/log v0.0.0-20200308114134-929b1006e34a h1:vcrhXnj9g9PIE+cmZgaPSwOyJ8MAQTRmsgGrB0x5rF4=
+github.com/unknwon/log v0.0.0-20200308114134-929b1006e34a/go.mod h1:1xEUf2abjfP92w2GZTV+GgaRxXErwRXcClbUwrNJffU=
+github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0=
+github.com/urfave/cli v1.22.16 h1:MH0k6uJxdwdeWQTwhSO42Pwr4YLrNLwBtg1MRgTqPdQ=
+github.com/urfave/cli v1.22.16/go.mod h1:EeJR6BKodywf4zciqrdw6hpCPk68JO9z5LazXZMn5Po=
github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM=
github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg=
+github.com/xanzy/go-gitlab v0.15.0/go.mod h1:8zdQa/ri1dfn8eS3Ir1SyfvOKlw7WBJ8DVThkpGiXrs=
+github.com/xdg/scram v0.0.0-20180814205039-7eeb5667e42c/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I=
+github.com/xdg/stringprep v1.0.0/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y=
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ=
+github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0=
+github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0=
+github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA=
+gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2cqquPa0MKWeNkmOM5RQsRhkrwMWonFMN7fE=
+go.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM=
+go.mongodb.org/mongo-driver v1.16.1 h1:rIVLL3q0IHM39dvE+z2ulZLp9ENZKThVfuvN/IiN4l8=
+go.mongodb.org/mongo-driver v1.16.1/go.mod h1:oB6AhJQvFQL4LEHyXi6aJzQJtBiTQHiAd83l0GdFaiw=
+go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk=
+go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
-go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ=
-go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y=
-go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0 h1:1fTNlAIJZGWLP5FVu0fikVry1IsiUnXjf7QFvoNN3Xw=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.35.0/go.mod h1:zjPK58DtkqQFn+YUMbx0M2XV3QgKU0gS9LeGohREyK4=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0/go.mod h1:90PoxvaEB5n6AOdZvi+yWJQoE95U8Dhhw2bSyRqnTD0=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0 h1:m639+BofXTvcY1q8CGs4ItwQarYtJPOWmVobfM1HpVI=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0/go.mod h1:LjReUci/F4BUyv+y4dwnq3h/26iNOeC3wAIqgvTIZVo=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0/go.mod h1:179AK5aar5R3eS9FucPy6rggvU0g52cvKId8pv4+v0c=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0 h1:xJ2qHD0C1BeYVTLLR9sX12+Qb95kfeD/byKj6Ky1pXg=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0/go.mod h1:u5BF1xyjstDowA1R5QAO9JHzqK+ublenEW/dyqTjBVk=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.36.0/go.mod h1:r49hO7CgrxY9Voaj3Xe8pANWtr0Oq916d0XAmOoCZAQ=
-go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M=
-go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE=
-go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs=
-go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY=
-go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg=
-go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY=
-go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o=
-go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w=
-go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs=
-go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc=
-go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
-go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4=
-go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4=
-go.opentelemetry.io/proto/otlp v1.6.0/go.mod h1:cicgGehlFuNdgZkcALOCh3VE6K/u2tAjzlRhDwmVpZc=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw=
+go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM=
+go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.61.0 h1:lREC4C0ilyP4WibDhQ7Gg2ygAQFP8oR07Fst/5cafwI=
+go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.61.0/go.mod h1:HfvuU0kW9HewH14VCOLImqKvUgONodURG7Alj/IrnGI=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY=
+go.opentelemetry.io/contrib/propagators/jaeger v1.36.0 h1:SoCgXYF4ISDtNyfLUzsGDaaudZVTx2yJhOyBO0+/GYk=
+go.opentelemetry.io/contrib/propagators/jaeger v1.36.0/go.mod h1:VHu48l0YTRKSObdPQ+Sb8xMZvdnJlN7yhHuHoPgNqHM=
+go.opentelemetry.io/contrib/samplers/jaegerremote v0.30.0 h1:bQ1Gvah4Sp8z7epSkgJaNTuZm7sutfA6Fji2/7cKFMc=
+go.opentelemetry.io/contrib/samplers/jaegerremote v0.30.0/go.mod h1:9b8Q9rH52NgYH3ShiTFB5wf18Vt3RTH/VMB7LDcC1ug=
+go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo=
+go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
+go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
+go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4=
+go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0 h1:bDMKF3RUSxshZ5OjOTi8rsHGaPKsAt76FaqgvIUySLc=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0/go.mod h1:dDT67G/IkA46Mr2l9Uj7HsQVwsjASyV9SjGofsiUZDA=
+go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM=
+go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
+go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
+go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E=
+go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
+go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
+go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
+go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
+go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ=
+go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
+go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
+go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os=
+go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo=
+go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
+go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
+go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
+go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
+go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE=
+go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/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-20190325154230-a5d413f7728c/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.38.0 h1:jt+WWG8IZlBnVbomuhg2Mdq0+BBQaHbtqHEFEigjUV8=
-golang.org/x/crypto v0.38.0/go.mod h1:MvrbAqul58NNYPKnOra203SB9vpuZW0e+RRZV+Ggqjw=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
+golang.org/x/crypto v0.39.0 h1:SHs+kF4LP+f+p14esP5jAoDpHU8Gu/v9lFRK6IT5imM=
golang.org/x/crypto v0.39.0/go.mod h1:L+Xg3Wf6HoL4Bn4238Z6ft6KfEpN0tJGo53AAPC632U=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
+golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.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.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w=
+golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
+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-20180906233101-161cd47e91fd/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-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-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-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-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY=
-golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E=
-golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY=
-golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds=
+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.41.0 h1:vBTly1HeNPEn3wtREYfy4GZ/NECgw2Cnl+nK6Nz3uvw=
golang.org/x/net v0.41.0/go.mod h1:B/K4NNqkfmg07DQYrbwvSluqCJOOXwUjeb/5lOisjbA=
-golang.org/x/oauth2 v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98=
-golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/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=
+golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI=
+golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610=
-golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
-golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
-golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/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.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
+golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+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-20180909124046-d0be0721c37e/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-20190102155601-82a175fd1598/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-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190426135247-a129542de9ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191020152052-9984515f0562/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/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-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
-golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20=
-golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220503163025-988cb79eb6c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-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.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.14.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.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw=
golang.org/x/sys v0.33.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
-golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o=
-golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw=
+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.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
+golang.org/x/term v0.32.0 h1:DR4lr0TjUs3epypdhTOkMmuF5CDFJ/8pOnbzMZPQ7bg=
golang.org/x/term v0.32.0/go.mod h1:uZG1FhGx848Sqfsq4/DlJr3xGGsYMu/L5GW4abiaEPQ=
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=
+golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0=
-golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU=
-golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA=
+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.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/text v0.26.0 h1:P42AVeLghgTYr4+xUnTRKDMqpar+PtX7KWuNQL21L8M=
golang.org/x/text v0.26.0/go.mod h1:QK15LZJUUQVJxhz7wXgxSy/CJaTFjd0G+YLonydOVQA=
+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.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0=
golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
+golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/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-20190114222345-bf090417da8b/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-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190425222832-ad9eeb80039a/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
-golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU=
-golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s=
-golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI=
+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.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo=
golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY=
+golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90=
gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0=
gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY=
-google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463 h1:hE3bRWtU6uceqlh4fhrSnUyjKHMKB9KrTLLG+bc0ddM=
-google.golang.org/genproto/googleapis/api v0.0.0-20250324211829-b45e905df463/go.mod h1:U90ffi8eUL9MwPcrJylN5+Mk2v3vuPDptd5yyNUiRR8=
-google.golang.org/genproto/googleapis/api v0.0.0-20250428153025-10db94c68c34/go.mod h1:0awUlEkap+Pb1UMeJwJQQAdJQrt3moU7J2moTy69irI=
-google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237/go.mod h1:ezi0AVyMKDWy5xAncvjLWH7UcLBB5n7y2fQ8MzjJcto=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463 h1:e0AIkUUhxyBKh6ssZNrAMeqhA7RKUj42346d1y02i2g=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250324211829-b45e905df463/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250428153025-10db94c68c34/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
-google.golang.org/grpc v1.71.1 h1:ffsFWr7ygTUscGPI0KKK6TLrGz0476KUvvsbqWK0rPI=
-google.golang.org/grpc v1.71.1/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec=
-google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
-google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
+gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
+gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
+google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
+google.golang.org/api v0.3.2/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk=
+google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190404172233-64821d5d2107/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
+google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY=
+google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
+google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
+google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok=
google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc=
+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=
+google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
+google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
+google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
+google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
+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=
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=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4=
gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/fsnotify/fsnotify.v1 v1.4.7 h1:XNNYLJHt73EyYiCZi6+xjupS9CpvmiDgjPTAjrBlQbo=
+gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE=
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
+gopkg.in/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.3.1 h1:WYFn/oANrAGP2C0dcV6/pbkPzv8yGzqTjPmTeO7qoXk=
+gopkg.in/mail.v2 v2.3.1/go.mod h1:htwXN1Qh09vZJ1NVKxQqHPBaCBbzKhp5GzuJEA4VJWw=
+gopkg.in/src-d/go-errors.v1 v1.0.0 h1:cooGdZnCjYbeS1zb1s6pVAAimTdKceRrpn7aKOnNIfc=
+gopkg.in/src-d/go-errors.v1 v1.0.0/go.mod h1:q1cBlomlw2FnDBDNGlnh6X0jPihy+QxZfMMNxPCbdYg=
+gopkg.in/telebot.v3 v3.2.1 h1:3I4LohaAyJBiivGmkfB+CiVu7QFOWkuZ4+KHgO/G3rs=
+gopkg.in/telebot.v3 v3.2.1/go.mod h1:GJKwwWqp9nSkIVN51eRKU78aB5f5OnQuWdwiIZfPbko=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.2/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.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-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls=
-k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k=
-k8s.io/api v0.33.1/go.mod h1:87esjTn9DRSRTD4fWMXamiXxJhpOIREjWOSjsW1kEHw=
-k8s.io/apiextensions-apiserver v0.32.3 h1:4D8vy+9GWerlErCwVIbcQjsWunF9SUGNu7O7hiQTyPY=
-k8s.io/apiextensions-apiserver v0.32.3/go.mod h1:8YwcvVRMVzw0r1Stc7XfGAzB/SIVLunqApySV5V7Dss=
-k8s.io/apiextensions-apiserver v0.33.1/go.mod h1:uNQ52z1A1Gu75QSa+pFK5bcXc4hq7lpOXbweZgi4dqA=
-k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U=
-k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE=
-k8s.io/apimachinery v0.33.1/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
-k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU=
-k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY=
-k8s.io/client-go v0.33.1/go.mod h1:JAsUrl1ArO7uRVFWfcj6kOomSlCv+JpvIsp6usAGefA=
+gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw=
+honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+k8s.io/api v0.33.3 h1:SRd5t//hhkI1buzxb288fy2xvjubstenEKL9K51KBI8=
+k8s.io/api v0.33.3/go.mod h1:01Y/iLUjNBM3TAvypct7DIj0M0NIZc+PzAHCIo0CYGE=
+k8s.io/apiextensions-apiserver v0.33.2 h1:6gnkIbngnaUflR3XwE1mCefN3YS8yTD631JXQhsU6M8=
+k8s.io/apiextensions-apiserver v0.33.2/go.mod h1:IvVanieYsEHJImTKXGP6XCOjTwv2LUMos0YWc9O+QP8=
+k8s.io/apimachinery v0.33.3 h1:4ZSrmNa0c/ZpZJhAgRdcsFcZOw1PQU1bALVQ0B3I5LA=
+k8s.io/apimachinery v0.33.3/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
+k8s.io/apiserver v0.33.3 h1:Wv0hGc+QFdMJB4ZSiHrCgN3zL3QRatu56+rpccKC3J4=
+k8s.io/apiserver v0.33.3/go.mod h1:05632ifFEe6TxwjdAIrwINHWE2hLwyADFk5mBsQa15E=
+k8s.io/client-go v0.33.3 h1:M5AfDnKfYmVJif92ngN532gFqakcGi6RvaOF16efrpA=
+k8s.io/client-go v0.33.3/go.mod h1:luqKBQggEf3shbxHY4uVENAxrDISLOarxpTKMiUuujg=
+k8s.io/component-base v0.33.3 h1:mlAuyJqyPlKZM7FyaoM/LcunZaaY353RXiOd2+B5tGA=
+k8s.io/component-base v0.33.3/go.mod h1:ktBVsBzkI3imDuxYXmVxZ2zxJnYTZ4HAsVj9iF09qp4=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4=
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo=
+k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0=
+k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc=
sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
-sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
+sigs.k8s.io/yaml v1.5.0 h1:M10b2U7aEUY6hRtU870n2VTPgR5RZiL/I6Lcc2F4NUQ=
+sigs.k8s.io/yaml v1.5.0/go.mod h1:wZs27Rbxoai4C0f8/9urLZtZtF3avA3gKvGyPdDqTO4=
+xorm.io/builder v0.3.6 h1:ha28mQ2M+TFx96Hxo+iq6tQgnkC9IZkM6D8w9sKHHF8=
+xorm.io/builder v0.3.6/go.mod h1:LEFAPISnRzG+zxaxj2vPicRwz67BdhFreKg8yv8/TgU=
diff --git a/apps/investigations/pkg/apis/investigations/v0alpha1/constants.go b/apps/investigations/pkg/apis/investigations/v0alpha1/constants.go
index 288c15885ce..bd538eb9c30 100644
--- a/apps/investigations/pkg/apis/investigations/v0alpha1/constants.go
+++ b/apps/investigations/pkg/apis/investigations/v0alpha1/constants.go
@@ -3,16 +3,16 @@ package v0alpha1
import "k8s.io/apimachinery/pkg/runtime/schema"
const (
- // Group is the API group used by all kinds in this package
- Group = "investigations.grafana.app"
- // Version is the API version used by all kinds in this package
- Version = "v0alpha1"
+ // APIGroup is the API group used by all kinds in this package
+ APIGroup = "investigations.grafana.app"
+ // APIVersion is the API version used by all kinds in this package
+ APIVersion = "v0alpha1"
)
var (
// GroupVersion is a schema.GroupVersion consisting of the Group and Version constants for this package
GroupVersion = schema.GroupVersion{
- Group: Group,
- Version: Version,
+ Group: APIGroup,
+ Version: APIVersion,
}
)
diff --git a/apps/investigations/pkg/apis/investigations/v0alpha1/investigation_metadata_gen.go b/apps/investigations/pkg/apis/investigations/v0alpha1/investigation_metadata_gen.go
index e0d2756f194..ffd588fec5e 100644
--- a/apps/investigations/pkg/apis/investigations/v0alpha1/investigation_metadata_gen.go
+++ b/apps/investigations/pkg/apis/investigations/v0alpha1/investigation_metadata_gen.go
@@ -24,5 +24,8 @@ type InvestigationMetadata struct {
// NewInvestigationMetadata creates a new InvestigationMetadata object.
func NewInvestigationMetadata() *InvestigationMetadata {
- return &InvestigationMetadata{}
+ return &InvestigationMetadata{
+ Finalizers: []string{},
+ Labels: map[string]string{},
+ }
}
diff --git a/apps/investigations/pkg/apis/investigations/v0alpha1/investigation_spec_gen.go b/apps/investigations/pkg/apis/investigations/v0alpha1/investigation_spec_gen.go
index 9ff1a1d4275..d56124603a2 100644
--- a/apps/investigations/pkg/apis/investigations/v0alpha1/investigation_spec_gen.go
+++ b/apps/investigations/pkg/apis/investigations/v0alpha1/investigation_spec_gen.go
@@ -40,6 +40,7 @@ type InvestigationCollectable struct {
// NewInvestigationCollectable creates a new InvestigationCollectable object.
func NewInvestigationCollectable() *InvestigationCollectable {
return &InvestigationCollectable{
+ Queries: []string{},
TimeRange: *NewInvestigationTimeRange(),
Datasource: *NewInvestigationDatasourceRef(),
}
@@ -101,6 +102,7 @@ type InvestigationSpec struct {
func NewInvestigationSpec() *InvestigationSpec {
return &InvestigationSpec{
CreatedByProfile: *NewInvestigationPerson(),
+ Collectables: []InvestigationCollectable{},
ViewMode: *NewInvestigationViewMode(),
}
}
diff --git a/apps/investigations/pkg/apis/investigations/v0alpha1/investigationindex_metadata_gen.go b/apps/investigations/pkg/apis/investigations/v0alpha1/investigationindex_metadata_gen.go
index 67e97598a93..e7bef02a137 100644
--- a/apps/investigations/pkg/apis/investigations/v0alpha1/investigationindex_metadata_gen.go
+++ b/apps/investigations/pkg/apis/investigations/v0alpha1/investigationindex_metadata_gen.go
@@ -24,5 +24,8 @@ type InvestigationIndexMetadata struct {
// NewInvestigationIndexMetadata creates a new InvestigationIndexMetadata object.
func NewInvestigationIndexMetadata() *InvestigationIndexMetadata {
- return &InvestigationIndexMetadata{}
+ return &InvestigationIndexMetadata{
+ Finalizers: []string{},
+ Labels: map[string]string{},
+ }
}
diff --git a/apps/investigations/pkg/apis/investigations/v0alpha1/investigationindex_spec_gen.go b/apps/investigations/pkg/apis/investigations/v0alpha1/investigationindex_spec_gen.go
index 4180a63a326..44be927c850 100644
--- a/apps/investigations/pkg/apis/investigations/v0alpha1/investigationindex_spec_gen.go
+++ b/apps/investigations/pkg/apis/investigations/v0alpha1/investigationindex_spec_gen.go
@@ -35,8 +35,9 @@ type InvestigationIndexInvestigationSummary struct {
// NewInvestigationIndexInvestigationSummary creates a new InvestigationIndexInvestigationSummary object.
func NewInvestigationIndexInvestigationSummary() *InvestigationIndexInvestigationSummary {
return &InvestigationIndexInvestigationSummary{
- CreatedByProfile: *NewInvestigationIndexPerson(),
- ViewMode: *NewInvestigationIndexViewMode(),
+ CreatedByProfile: *NewInvestigationIndexPerson(),
+ ViewMode: *NewInvestigationIndexViewMode(),
+ CollectableSummaries: []InvestigationIndexCollectableSummary{},
}
}
@@ -79,7 +80,8 @@ type InvestigationIndexSpec struct {
// NewInvestigationIndexSpec creates a new InvestigationIndexSpec object.
func NewInvestigationIndexSpec() *InvestigationIndexSpec {
return &InvestigationIndexSpec{
- Owner: *NewInvestigationIndexPerson(),
+ Owner: *NewInvestigationIndexPerson(),
+ InvestigationSummaries: []InvestigationIndexInvestigationSummary{},
}
}
diff --git a/apps/investigations/pkg/apis/investigations_manifest.go b/apps/investigations/pkg/apis/investigations_manifest.go
index be270ae598f..908b542ffd0 100644
--- a/apps/investigations/pkg/apis/investigations_manifest.go
+++ b/apps/investigations/pkg/apis/investigations_manifest.go
@@ -7,8 +7,13 @@ package apis
import (
"encoding/json"
+ "fmt"
+ "strings"
"github.com/grafana/grafana-app-sdk/app"
+ "github.com/grafana/grafana-app-sdk/resource"
+
+ v0alpha1 "github.com/grafana/grafana/apps/investigations/pkg/apis/investigations/v0alpha1"
)
var (
@@ -23,39 +28,31 @@ var (
var appManifestData = app.ManifestData{
AppName: "investigations",
Group: "investigations.grafana.app",
- Kinds: []app.ManifestKind{
+ Versions: []app.ManifestVersion{
{
- Kind: "Investigation",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
+ Name: "v0alpha1",
+ Served: true,
+ Kinds: []app.ManifestVersionKind{
{
- Name: "v0alpha1",
- Schema: &versionSchemaInvestigationv0alpha1,
+ Kind: "Investigation",
+ Plural: "Investigations",
+ Scope: "Namespaced",
+ Conversion: false,
+ Schema: &versionSchemaInvestigationv0alpha1,
},
- },
- },
- {
- Kind: "InvestigationIndex",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
{
- Name: "v0alpha1",
- Schema: &versionSchemaInvestigationIndexv0alpha1,
+ Kind: "InvestigationIndex",
+ Plural: "InvestigationIndexes",
+ Scope: "Namespaced",
+ Conversion: false,
+ Schema: &versionSchemaInvestigationIndexv0alpha1,
},
},
},
},
}
-func jsonToMap(j string) map[string]any {
- m := make(map[string]any)
- json.Unmarshal([]byte(j), &j)
- return m
-}
-
func LocalManifest() app.Manifest {
return app.NewEmbeddedManifest(appManifestData)
}
@@ -63,3 +60,28 @@ func LocalManifest() app.Manifest {
func RemoteManifest() app.Manifest {
return app.NewAPIServerManifest("investigations")
}
+
+var kindVersionToGoType = map[string]resource.Kind{
+ "Investigation/v0alpha1": v0alpha1.InvestigationKind(),
+ "InvestigationIndex/v0alpha1": v0alpha1.InvestigationIndexKind(),
+}
+
+// ManifestGoTypeAssociator returns the associated resource.Kind instance for a given Kind and Version, if one exists.
+// If there is no association for the provided Kind and Version, exists will return false.
+func ManifestGoTypeAssociator(kind, version string) (goType resource.Kind, exists bool) {
+ goType, exists = kindVersionToGoType[fmt.Sprintf("%s/%s", kind, version)]
+ return goType, exists
+}
+
+var customRouteToGoResponseType = map[string]any{}
+
+// ManifestCustomRouteResponsesAssociator returns the associated response go type for a given kind, version, custom route path, and method, if one exists.
+// kind may be empty for custom routes which are not kind subroutes. Leading slashes are removed from subroute paths.
+// If there is no association for the provided kind, version, custom route path, and method, exists will return false.
+func ManifestCustomRouteResponsesAssociator(kind, version, path, verb string) (goType any, exists bool) {
+ if len(path) > 0 && path[0] == '/' {
+ path = path[1:]
+ }
+ goType, exists = customRouteToGoResponseType[fmt.Sprintf("%s|%s|%s|%s", version, kind, path, strings.ToUpper(verb))]
+ return goType, exists
+}
diff --git a/apps/playlist/Makefile b/apps/playlist/Makefile
index 7188b890ad4..230bfd4149a 100644
--- a/apps/playlist/Makefile
+++ b/apps/playlist/Makefile
@@ -1,29 +1,9 @@
-APP_SDK_VERSION := v0.39.0
-APP_SDK_DIR := $(shell go env GOPATH)/bin/app-sdk-$(APP_SDK_VERSION)
-APP_SDK_BIN := $(APP_SDK_DIR)/grafana-app-sdk
+include ../sdk.mk
-.PHONY: install-app-sdk
-install-app-sdk: $(APP_SDK_BIN) ## Install the Grafana App SDK
-
-$(APP_SDK_BIN):
- @echo "Installing Grafana App SDK version $(APP_SDK_VERSION)"
- @mkdir -p $(APP_SDK_DIR)
- # The only way to install specific versions of binaries using `go install`
- # is by setting GOBIN to the directory you want to install the binary to.
- GOBIN=$(APP_SDK_DIR) go install github.com/grafana/grafana-app-sdk/cmd/grafana-app-sdk@$(APP_SDK_VERSION)
- @touch $@
-
-.PHONY: update-app-sdk
-update-app-sdk: ## Update the Grafana App SDK dependency in go.mod
- go get github.com/grafana/grafana-app-sdk@$(APP_SDK_VERSION)
- go mod tidy
-
-.PHONY: generate
-generate: install-app-sdk update-app-sdk ## Run Grafana App SDK code generation
+.PHONY: generate # Run Grafana App SDK code generation
+generate: install-app-sdk update-app-sdk
@$(APP_SDK_BIN) generate \
--source=./kinds/ \
--gogenpath=./pkg/apis \
--grouping=group \
- --defencoding=none \
- --noschemasinmanifest \
- --postprocess
\ No newline at end of file
+ --defencoding=none
\ No newline at end of file
diff --git a/apps/playlist/go.mod b/apps/playlist/go.mod
index 47c762b5a24..1bb57fe534b 100644
--- a/apps/playlist/go.mod
+++ b/apps/playlist/go.mod
@@ -1,13 +1,12 @@
module github.com/grafana/grafana/apps/playlist
-go 1.24.4
+go 1.24.5
require (
- github.com/grafana/grafana-app-sdk v0.39.2
- k8s.io/apimachinery v0.33.2
- k8s.io/client-go v0.33.2
+ github.com/grafana/grafana-app-sdk v0.40.0
+ k8s.io/apimachinery v0.33.3
+ k8s.io/client-go v0.33.3
k8s.io/klog/v2 v2.130.1
- k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff
)
require (
@@ -16,11 +15,11 @@ require (
github.com/cenkalti/backoff/v5 v5.0.2 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
- github.com/emicklei/go-restful/v3 v3.11.0 // indirect
+ github.com/emicklei/go-restful/v3 v3.12.1 // indirect
github.com/evanphx/json-patch v5.9.11+incompatible // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/getkin/kin-openapi v0.132.0 // indirect
- github.com/go-logr/logr v1.4.2 // indirect
+ github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
@@ -31,13 +30,13 @@ require (
github.com/google/go-cmp v0.7.0 // indirect
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect
github.com/google/uuid v1.6.0 // indirect
- github.com/grafana/grafana-app-sdk/logging v0.39.1 // indirect
- github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect
+ github.com/grafana/grafana-app-sdk/logging v0.39.3 // indirect
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
- github.com/mailru/easyjson v0.7.7 // indirect
+ github.com/mailru/easyjson v0.9.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
@@ -49,25 +48,26 @@ require (
github.com/perimeterx/marshmallow v1.1.5 // indirect
github.com/prometheus/client_golang v1.22.0 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
- github.com/prometheus/common v0.64.0 // indirect
+ github.com/prometheus/common v0.65.0 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/puzpuzpuz/xsync/v2 v2.5.1 // indirect
github.com/rogpeppe/go-internal v1.14.1 // indirect
github.com/spf13/pflag v1.0.6 // indirect
github.com/x448/float16 v0.8.4 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
- go.opentelemetry.io/otel v1.36.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.36.0 // indirect
- go.opentelemetry.io/otel/metric v1.36.0 // indirect
- go.opentelemetry.io/otel/sdk v1.36.0 // indirect
- go.opentelemetry.io/otel/sdk/metric v1.36.0 // indirect
- go.opentelemetry.io/otel/trace v1.36.0 // indirect
- go.opentelemetry.io/proto/otlp v1.6.0 // indirect
+ go.opentelemetry.io/otel v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0 // indirect
+ go.opentelemetry.io/otel/metric v1.37.0 // indirect
+ go.opentelemetry.io/otel/sdk v1.37.0 // indirect
+ go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect
+ go.opentelemetry.io/otel/trace v1.37.0 // indirect
+ go.opentelemetry.io/proto/otlp v1.7.0 // indirect
+ go.yaml.in/yaml/v2 v2.4.2 // indirect
golang.org/x/net v0.41.0 // indirect
golang.org/x/oauth2 v0.30.0 // indirect
- golang.org/x/sync v0.15.0 // indirect
+ golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.33.0 // indirect
golang.org/x/term v0.32.0 // indirect
golang.org/x/text v0.26.0 // indirect
@@ -79,11 +79,12 @@ require (
google.golang.org/protobuf v1.36.6 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
- k8s.io/api v0.33.2 // indirect
+ k8s.io/api v0.33.3 // indirect
k8s.io/apiextensions-apiserver v0.33.2 // indirect
- k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect
- sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
+ k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // indirect
+ k8s.io/utils v0.0.0-20241210054802-24370beab758 // indirect
+ sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect
- sigs.k8s.io/yaml v1.4.0 // indirect
+ sigs.k8s.io/yaml v1.5.0 // indirect
)
diff --git a/apps/playlist/go.sum b/apps/playlist/go.sum
index 9cbf8457905..6558ce86a17 100644
--- a/apps/playlist/go.sum
+++ b/apps/playlist/go.sum
@@ -10,8 +10,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
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/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
-github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU=
+github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/evanphx/json-patch v5.9.11+incompatible h1:ixHHqfcGvxhWkniF1tWxBHA0yb4Z+d1UQi45df52xW8=
github.com/evanphx/json-patch v5.9.11+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk=
github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
@@ -19,8 +19,8 @@ github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXE
github.com/getkin/kin-openapi v0.132.0 h1:3ISeLMsQzcb5v26yeJrBcdTCEQTag36ZjaGk7MIRUwk=
github.com/getkin/kin-openapi v0.132.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
-github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
+github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
@@ -47,12 +47,12 @@ github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J
github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/grafana/grafana-app-sdk v0.39.2 h1:ymfr+1318t+JC9U2OYrzVpGmNG/aJONUmFFu/G98Xh8=
-github.com/grafana/grafana-app-sdk v0.39.2/go.mod h1:t0m6q561lpoHQCixS9LUHFUhUzDClzNtm7BH60gHVSY=
-github.com/grafana/grafana-app-sdk/logging v0.39.1 h1:lI5rbrheuwVPuyIM6LIuEYOCSpgmXahfKtqeMyhbGPU=
-github.com/grafana/grafana-app-sdk/logging v0.39.1/go.mod h1:WhDENSnaGHtyVVwZGVnAR7YLvh2xlLDYR3D7E6h7XVk=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI=
+github.com/grafana/grafana-app-sdk v0.40.0 h1:KilbCFMYox2cnIi1W6ql7W+n9kms/NvWlBPM1m4Q4mg=
+github.com/grafana/grafana-app-sdk v0.40.0/go.mod h1:fn943JEM0CR3mY/Gd3816MUcpob5xnKc8MoojnbMjYY=
+github.com/grafana/grafana-app-sdk/logging v0.39.3 h1:mMrcYahnoRu7blKyL/ZVcgv7WCiI2CqxODYh8tBFUgY=
+github.com/grafana/grafana-app-sdk/logging v0.39.3/go.mod h1:otUD9XpJD7A5sCLb8mcs9hIXGdeV6lnhzVwe747g4RU=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -72,8 +72,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
-github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
-github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=
+github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -102,8 +102,8 @@ github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/
github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
-github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
-github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
+github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE=
+github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
github.com/puzpuzpuz/xsync/v2 v2.5.1 h1:mVGYAvzDSu52+zaGyNjC+24Xw2bQi3kTr4QJ6N9pIIU=
@@ -126,26 +126,30 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
-go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg=
-go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0 h1:dNzwXjZKpMpE2JhmO+9HsPl42NIXFIFSUSSs0fiqra0=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0/go.mod h1:90PoxvaEB5n6AOdZvi+yWJQoE95U8Dhhw2bSyRqnTD0=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0 h1:JgtbA0xkWHnTmYk7YusopJFX6uleBmAuZ8n05NEh8nQ=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0/go.mod h1:179AK5aar5R3eS9FucPy6rggvU0g52cvKId8pv4+v0c=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.36.0 h1:nRVXXvf78e00EwY6Wp0YII8ww2JVWshZ20HfTlE11AM=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.36.0/go.mod h1:r49hO7CgrxY9Voaj3Xe8pANWtr0Oq916d0XAmOoCZAQ=
-go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE=
-go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs=
-go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs=
-go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY=
-go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis=
-go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4=
-go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w=
-go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
-go.opentelemetry.io/proto/otlp v1.6.0 h1:jQjP+AQyTf+Fe7OKj/MfkDrmK4MNVtw2NpXsf9fefDI=
-go.opentelemetry.io/proto/otlp v1.6.0/go.mod h1:cicgGehlFuNdgZkcALOCh3VE6K/u2tAjzlRhDwmVpZc=
+go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
+go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0 h1:bDMKF3RUSxshZ5OjOTi8rsHGaPKsAt76FaqgvIUySLc=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0/go.mod h1:dDT67G/IkA46Mr2l9Uj7HsQVwsjASyV9SjGofsiUZDA=
+go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
+go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
+go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
+go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
+go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
+go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
+go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
+go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
+go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os=
+go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
+go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
+go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
+go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE=
+go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -162,8 +166,8 @@ golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKl
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
-golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
+golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
@@ -206,26 +210,27 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/api v0.33.2 h1:YgwIS5jKfA+BZg//OQhkJNIfie/kmRsO0BmNaVSimvY=
-k8s.io/api v0.33.2/go.mod h1:fhrbphQJSM2cXzCWgqU29xLDuks4mu7ti9vveEnpSXs=
+k8s.io/api v0.33.3 h1:SRd5t//hhkI1buzxb288fy2xvjubstenEKL9K51KBI8=
+k8s.io/api v0.33.3/go.mod h1:01Y/iLUjNBM3TAvypct7DIj0M0NIZc+PzAHCIo0CYGE=
k8s.io/apiextensions-apiserver v0.33.2 h1:6gnkIbngnaUflR3XwE1mCefN3YS8yTD631JXQhsU6M8=
k8s.io/apiextensions-apiserver v0.33.2/go.mod h1:IvVanieYsEHJImTKXGP6XCOjTwv2LUMos0YWc9O+QP8=
-k8s.io/apimachinery v0.33.2 h1:IHFVhqg59mb8PJWTLi8m1mAoepkUNYmptHsV+Z1m5jY=
-k8s.io/apimachinery v0.33.2/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
-k8s.io/client-go v0.33.2 h1:z8CIcc0P581x/J1ZYf4CNzRKxRvQAwoAolYPbtQes+E=
-k8s.io/client-go v0.33.2/go.mod h1:9mCgT4wROvL948w6f6ArJNb7yQd7QsvqavDeZHvNmHo=
+k8s.io/apimachinery v0.33.3 h1:4ZSrmNa0c/ZpZJhAgRdcsFcZOw1PQU1bALVQ0B3I5LA=
+k8s.io/apimachinery v0.33.3/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
+k8s.io/client-go v0.33.3 h1:M5AfDnKfYmVJif92ngN532gFqakcGi6RvaOF16efrpA=
+k8s.io/client-go v0.33.3/go.mod h1:luqKBQggEf3shbxHY4uVENAxrDISLOarxpTKMiUuujg=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4=
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo=
+k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0=
+k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc=
sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
-sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
+sigs.k8s.io/yaml v1.5.0 h1:M10b2U7aEUY6hRtU870n2VTPgR5RZiL/I6Lcc2F4NUQ=
+sigs.k8s.io/yaml v1.5.0/go.mod h1:wZs27Rbxoai4C0f8/9urLZtZtF3avA3gKvGyPdDqTO4=
diff --git a/apps/playlist/kinds/manifest.cue b/apps/playlist/kinds/manifest.cue
index 172bc419200..aec60b82f9e 100644
--- a/apps/playlist/kinds/manifest.cue
+++ b/apps/playlist/kinds/manifest.cue
@@ -3,7 +3,15 @@ package playlist
manifest: {
appName: "playlist"
groupOverride: "playlist.grafana.app"
- kinds: [
- playlist,
- ]
+ versions: {
+ "v0alpha1": {
+ codegen: {
+ ts: {enabled: false}
+ go: {enabled: true}
+ }
+ kinds: [
+ playlistv0alpha1,
+ ]
+ }
+ }
}
diff --git a/apps/playlist/kinds/playlist.cue b/apps/playlist/kinds/playlist.cue
index bfcc5db6aed..e6a4d39a0b6 100644
--- a/apps/playlist/kinds/playlist.cue
+++ b/apps/playlist/kinds/playlist.cue
@@ -1,46 +1,38 @@
package playlist
-playlist: {
- kind: "Playlist"
- pluralName: "Playlists"
- current: "v0alpha1"
- versions: {
- "v0alpha1": {
- codegen: {
- frontend: false
- backend: true
- }
- validation: {
- operations: [
- "CREATE",
- "UPDATE",
- ]
- }
- mutation: {
- operations: [
- "CREATE",
- "UPDATE",
- ]
- }
- schema: {
- #Item: {
- // type of the item.
- type: "dashboard_by_tag" | "dashboard_by_uid" | "dashboard_by_id" @cuetsy(kind="enum")
- // Value depends on type and describes the playlist item.
- // - dashboard_by_id: The value is an internal numerical identifier set by Grafana. This
- // is not portable as the numerical identifier is non-deterministic between different instances.
- // Will be replaced by dashboard_by_uid in the future. (deprecated)
- // - dashboard_by_tag: The value is a tag which is set on any number of dashboards. All
- // dashboards behind the tag will be added to the playlist.
- // - dashboard_by_uid: The value is the dashboard UID
- value: string
- }
- spec: {
- title: string
- interval: string
- items: [...#Item]
- }
- }
+playlistv0alpha1: {
+ kind: "Playlist"
+ plural: "playlists"
+ scope: "Namespaced"
+ validation: {
+ operations: [
+ "CREATE",
+ "UPDATE",
+ ]
+ }
+ mutation: {
+ operations: [
+ "CREATE",
+ "UPDATE",
+ ]
+ }
+ schema: {
+ #Item: {
+ // type of the item.
+ type: "dashboard_by_tag" | "dashboard_by_uid" | "dashboard_by_id" @cuetsy(kind="enum")
+ // Value depends on type and describes the playlist item.
+ // - dashboard_by_id: The value is an internal numerical identifier set by Grafana. This
+ // is not portable as the numerical identifier is non-deterministic between different instances.
+ // Will be replaced by dashboard_by_uid in the future. (deprecated)
+ // - dashboard_by_tag: The value is a tag which is set on any number of dashboards. All
+ // dashboards behind the tag will be added to the playlist.
+ // - dashboard_by_uid: The value is the dashboard UID
+ value: string
+ }
+ spec: {
+ title: string
+ interval: string
+ items: [...#Item]
}
}
}
diff --git a/apps/playlist/pkg/apis/playlist/v0alpha1/zz_openapi_gen.go b/apps/playlist/pkg/apis/playlist/v0alpha1/zz_openapi_gen.go
deleted file mode 100644
index 8dba9b173b6..00000000000
--- a/apps/playlist/pkg/apis/playlist/v0alpha1/zz_openapi_gen.go
+++ /dev/null
@@ -1,284 +0,0 @@
-//go:build !ignore_autogenerated
-// +build !ignore_autogenerated
-
-// Code generated by grafana-app-sdk. DO NOT EDIT.
-
-package v0alpha1
-
-import (
- common "k8s.io/kube-openapi/pkg/common"
- spec "k8s.io/kube-openapi/pkg/validation/spec"
-)
-
-func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenAPIDefinition {
- return map[string]common.OpenAPIDefinition{
- "github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1.Playlist": schema_pkg_apis_playlist_v0alpha1_Playlist(ref),
- "github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1.PlaylistItem": schema_pkg_apis_playlist_v0alpha1_PlaylistItem(ref),
- "github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1.PlaylistList": schema_pkg_apis_playlist_v0alpha1_PlaylistList(ref),
- "github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1.PlaylistSpec": schema_pkg_apis_playlist_v0alpha1_PlaylistSpec(ref),
- "github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1.PlaylistStatus": schema_pkg_apis_playlist_v0alpha1_PlaylistStatus(ref),
- "github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1.PlayliststatusOperatorState": schema_pkg_apis_playlist_v0alpha1_PlayliststatusOperatorState(ref),
- }
-}
-
-func schema_pkg_apis_playlist_v0alpha1_Playlist(ref common.ReferenceCallback) common.OpenAPIDefinition {
- return common.OpenAPIDefinition{
- Schema: spec.Schema{
- SchemaProps: spec.SchemaProps{
- Type: []string{"object"},
- Properties: map[string]spec.Schema{
- "kind": {
- SchemaProps: spec.SchemaProps{
- Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
- Type: []string{"string"},
- Format: "",
- },
- },
- "apiVersion": {
- SchemaProps: spec.SchemaProps{
- Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
- Type: []string{"string"},
- Format: "",
- },
- },
- "metadata": {
- SchemaProps: spec.SchemaProps{
- Default: map[string]interface{}{},
- Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"),
- },
- },
- "spec": {
- SchemaProps: spec.SchemaProps{
- Description: "Spec is the spec of the Playlist",
- Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1.PlaylistSpec"),
- },
- },
- "status": {
- SchemaProps: spec.SchemaProps{
- Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1.PlaylistStatus"),
- },
- },
- },
- Required: []string{"metadata", "spec", "status"},
- },
- },
- Dependencies: []string{
- "github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1.PlaylistSpec", "github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1.PlaylistStatus", "k8s.io/apimachinery/pkg/apis/meta/v1.ObjectMeta"},
- }
-}
-
-func schema_pkg_apis_playlist_v0alpha1_PlaylistItem(ref common.ReferenceCallback) common.OpenAPIDefinition {
- return common.OpenAPIDefinition{
- Schema: spec.Schema{
- SchemaProps: spec.SchemaProps{
- Type: []string{"object"},
- Properties: map[string]spec.Schema{
- "type": {
- SchemaProps: spec.SchemaProps{
- Description: "type of the item.",
- Default: "",
- Type: []string{"string"},
- Format: "",
- },
- },
- "value": {
- SchemaProps: spec.SchemaProps{
- Description: "Value depends on type and describes the playlist item.\n - dashboard_by_id: The value is an internal numerical identifier set by Grafana. This\n is not portable as the numerical identifier is non-deterministic between different instances.\n Will be replaced by dashboard_by_uid in the future. (deprecated)\n - dashboard_by_tag: The value is a tag which is set on any number of dashboards. All\n dashboards behind the tag will be added to the playlist.\n - dashboard_by_uid: The value is the dashboard UID",
- Default: "",
- Type: []string{"string"},
- Format: "",
- },
- },
- },
- Required: []string{"type", "value"},
- },
- },
- }
-}
-
-func schema_pkg_apis_playlist_v0alpha1_PlaylistList(ref common.ReferenceCallback) common.OpenAPIDefinition {
- return common.OpenAPIDefinition{
- Schema: spec.Schema{
- SchemaProps: spec.SchemaProps{
- Type: []string{"object"},
- Properties: map[string]spec.Schema{
- "kind": {
- SchemaProps: spec.SchemaProps{
- Description: "Kind is a string value representing the REST resource this object represents. Servers may infer this from the endpoint the client submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds",
- Type: []string{"string"},
- Format: "",
- },
- },
- "apiVersion": {
- SchemaProps: spec.SchemaProps{
- Description: "APIVersion defines the versioned schema of this representation of an object. Servers should convert recognized schemas to the latest internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources",
- Type: []string{"string"},
- Format: "",
- },
- },
- "metadata": {
- SchemaProps: spec.SchemaProps{
- Default: map[string]interface{}{},
- Ref: ref("k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"),
- },
- },
- "items": {
- SchemaProps: spec.SchemaProps{
- Type: []string{"array"},
- Items: &spec.SchemaOrArray{
- Schema: &spec.Schema{
- SchemaProps: spec.SchemaProps{
- Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1.Playlist"),
- },
- },
- },
- },
- },
- },
- Required: []string{"metadata", "items"},
- },
- },
- Dependencies: []string{
- "github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1.Playlist", "k8s.io/apimachinery/pkg/apis/meta/v1.ListMeta"},
- }
-}
-
-func schema_pkg_apis_playlist_v0alpha1_PlaylistSpec(ref common.ReferenceCallback) common.OpenAPIDefinition {
- return common.OpenAPIDefinition{
- Schema: spec.Schema{
- SchemaProps: spec.SchemaProps{
- Type: []string{"object"},
- Properties: map[string]spec.Schema{
- "title": {
- SchemaProps: spec.SchemaProps{
- Default: "",
- Type: []string{"string"},
- Format: "",
- },
- },
- "interval": {
- SchemaProps: spec.SchemaProps{
- Default: "",
- Type: []string{"string"},
- Format: "",
- },
- },
- "items": {
- SchemaProps: spec.SchemaProps{
- Type: []string{"array"},
- Items: &spec.SchemaOrArray{
- Schema: &spec.Schema{
- SchemaProps: spec.SchemaProps{
- Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1.PlaylistItem"),
- },
- },
- },
- },
- },
- },
- Required: []string{"title", "interval", "items"},
- },
- },
- Dependencies: []string{
- "github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1.PlaylistItem"},
- }
-}
-
-func schema_pkg_apis_playlist_v0alpha1_PlaylistStatus(ref common.ReferenceCallback) common.OpenAPIDefinition {
- return common.OpenAPIDefinition{
- Schema: spec.Schema{
- SchemaProps: spec.SchemaProps{
- Type: []string{"object"},
- Properties: map[string]spec.Schema{
- "operatorStates": {
- SchemaProps: spec.SchemaProps{
- Description: "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.",
- Type: []string{"object"},
- AdditionalProperties: &spec.SchemaOrBool{
- Allows: true,
- Schema: &spec.Schema{
- SchemaProps: spec.SchemaProps{
- Default: map[string]interface{}{},
- Ref: ref("github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1.PlayliststatusOperatorState"),
- },
- },
- },
- },
- },
- "additionalFields": {
- SchemaProps: spec.SchemaProps{
- Description: "additionalFields is reserved for future use",
- Type: []string{"object"},
- AdditionalProperties: &spec.SchemaOrBool{
- Allows: true,
- Schema: &spec.Schema{
- SchemaProps: spec.SchemaProps{
- Type: []string{"object"},
- Format: "",
- },
- },
- },
- },
- },
- },
- },
- },
- Dependencies: []string{
- "github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1.PlayliststatusOperatorState"},
- }
-}
-
-func schema_pkg_apis_playlist_v0alpha1_PlayliststatusOperatorState(ref common.ReferenceCallback) common.OpenAPIDefinition {
- return common.OpenAPIDefinition{
- Schema: spec.Schema{
- SchemaProps: spec.SchemaProps{
- Type: []string{"object"},
- Properties: map[string]spec.Schema{
- "lastEvaluation": {
- SchemaProps: spec.SchemaProps{
- Description: "lastEvaluation is the ResourceVersion last evaluated",
- Default: "",
- Type: []string{"string"},
- Format: "",
- },
- },
- "state": {
- SchemaProps: spec.SchemaProps{
- Description: "state describes the state of the lastEvaluation. It is limited to three possible states for machine evaluation.",
- Default: "",
- Type: []string{"string"},
- Format: "",
- },
- },
- "descriptiveState": {
- SchemaProps: spec.SchemaProps{
- Description: "descriptiveState is an optional more descriptive state field which has no requirements on format",
- Type: []string{"string"},
- Format: "",
- },
- },
- "details": {
- SchemaProps: spec.SchemaProps{
- Description: "details contains any extra information that is operator-specific",
- Type: []string{"object"},
- AdditionalProperties: &spec.SchemaOrBool{
- Allows: true,
- Schema: &spec.Schema{
- SchemaProps: spec.SchemaProps{
- Type: []string{"object"},
- Format: "",
- },
- },
- },
- },
- },
- },
- Required: []string{"lastEvaluation", "state"},
- },
- },
- }
-}
diff --git a/apps/playlist/pkg/apis/playlist_manifest.go b/apps/playlist/pkg/apis/playlist_manifest.go
index 7973fdf4e6d..bc2d3ad6930 100644
--- a/apps/playlist/pkg/apis/playlist_manifest.go
+++ b/apps/playlist/pkg/apis/playlist_manifest.go
@@ -6,7 +6,9 @@
package apis
import (
+ "encoding/json"
"fmt"
+ "strings"
"github.com/grafana/grafana-app-sdk/app"
"github.com/grafana/grafana-app-sdk/resource"
@@ -14,17 +16,25 @@ import (
v0alpha1 "github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1"
)
+var (
+ rawSchemaPlaylistv0alpha1 = []byte(`{"spec":{"properties":{"interval":{"type":"string"},"items":{"items":{"properties":{"type":{"description":"type of the item.","enum":["dashboard_by_tag","dashboard_by_uid","dashboard_by_id"],"type":"string"},"value":{"description":"Value depends on type and describes the playlist item.\n - dashboard_by_id: The value is an internal numerical identifier set by Grafana. This\n is not portable as the numerical identifier is non-deterministic between different instances.\n Will be replaced by dashboard_by_uid in the future. (deprecated)\n - dashboard_by_tag: The value is a tag which is set on any number of dashboards. All\n dashboards behind the tag will be added to the playlist.\n - dashboard_by_uid: The value is the dashboard UID","type":"string"}},"required":["type","value"],"type":"object"},"type":"array"},"title":{"type":"string"}},"required":["title","interval","items"],"type":"object"},"status":{"properties":{"additionalFields":{"description":"additionalFields is reserved for future use","type":"object","x-kubernetes-preserve-unknown-fields":true},"operatorStates":{"additionalProperties":{"properties":{"descriptiveState":{"description":"descriptiveState is an optional more descriptive state field which has no requirements on format","type":"string"},"details":{"description":"details contains any extra information that is operator-specific","type":"object","x-kubernetes-preserve-unknown-fields":true},"lastEvaluation":{"description":"lastEvaluation is the ResourceVersion last evaluated","type":"string"},"state":{"description":"state describes the state of the lastEvaluation.\nIt is limited to three possible states for machine evaluation.","enum":["success","in_progress","failed"],"type":"string"}},"required":["lastEvaluation","state"],"type":"object"},"description":"operatorStates is a map of operator ID to operator state evaluations.\nAny operator which consumes this kind SHOULD add its state evaluation information to this field.","type":"object"}},"type":"object"}}`)
+ versionSchemaPlaylistv0alpha1 app.VersionSchema
+ _ = json.Unmarshal(rawSchemaPlaylistv0alpha1, &versionSchemaPlaylistv0alpha1)
+)
+
var appManifestData = app.ManifestData{
AppName: "playlist",
Group: "playlist.grafana.app",
- Kinds: []app.ManifestKind{
+ Versions: []app.ManifestVersion{
{
- Kind: "Playlist",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
+ Name: "v0alpha1",
+ Served: true,
+ Kinds: []app.ManifestVersionKind{
{
- Name: "v0alpha1",
+ Kind: "Playlist",
+ Plural: "Playlists",
+ Scope: "Namespaced",
+ Conversion: false,
Admission: &app.AdmissionCapabilities{
Validation: &app.ValidationCapability{
Operations: []app.AdmissionOperation{
@@ -39,6 +49,7 @@ var appManifestData = app.ManifestData{
},
},
},
+ Schema: &versionSchemaPlaylistv0alpha1,
},
},
},
@@ -63,3 +74,16 @@ func ManifestGoTypeAssociator(kind, version string) (goType resource.Kind, exist
goType, exists = kindVersionToGoType[fmt.Sprintf("%s/%s", kind, version)]
return goType, exists
}
+
+var customRouteToGoResponseType = map[string]any{}
+
+// ManifestCustomRouteResponsesAssociator returns the associated response go type for a given kind, version, custom route path, and method, if one exists.
+// kind may be empty for custom routes which are not kind subroutes. Leading slashes are removed from subroute paths.
+// If there is no association for the provided kind, version, custom route path, and method, exists will return false.
+func ManifestCustomRouteResponsesAssociator(kind, version, path, verb string) (goType any, exists bool) {
+ if len(path) > 0 && path[0] == '/' {
+ path = path[1:]
+ }
+ goType, exists = customRouteToGoResponseType[fmt.Sprintf("%s|%s|%s|%s", version, kind, path, strings.ToUpper(verb))]
+ return goType, exists
+}
diff --git a/apps/playlist/pkg/app/app.go b/apps/playlist/pkg/app/app.go
index 184372310f5..222c144ef8c 100644
--- a/apps/playlist/pkg/app/app.go
+++ b/apps/playlist/pkg/app/app.go
@@ -12,9 +12,8 @@ import (
"k8s.io/client-go/rest"
"k8s.io/klog/v2"
- "github.com/grafana/grafana/apps/playlist/pkg/reconcilers"
-
playlistv0alpha1 "github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1"
+ "github.com/grafana/grafana/apps/playlist/pkg/reconcilers"
)
type PlaylistConfig struct {
diff --git a/apps/sdk.mk b/apps/sdk.mk
new file mode 100644
index 00000000000..7a0f51237cf
--- /dev/null
+++ b/apps/sdk.mk
@@ -0,0 +1,23 @@
+APP_SDK_VERSION = v0.40.0
+APP_SDK_DIR = $(shell go env GOPATH)/bin/app-sdk-$(APP_SDK_VERSION)
+APP_SDK_BIN = $(APP_SDK_DIR)/grafana-app-sdk
+
+
+.PHONY: install-app-sdk
+install-app-sdk: echodir $(APP_SDK_BIN) ## Install the Grafana App SDK
+
+.PHONY: echodir
+
+$(APP_SDK_BIN):
+ @echo "Installing Grafana App SDK version $(APP_SDK_VERSION)"
+ @mkdir -p $(APP_SDK_DIR)
+ # The only way to install specific versions of binaries using `go install`
+ # is by setting GOBIN to the directory you want to install the binary to.
+ GOBIN=$(APP_SDK_DIR) go install github.com/grafana/grafana-app-sdk/cmd/grafana-app-sdk@$(APP_SDK_VERSION)
+ @touch $@
+
+.PHONY: update-app-sdk
+update-app-sdk: ## Update the Grafana App SDK dependency in go.mod
+ @pwd
+ go get github.com/grafana/grafana-app-sdk@$(APP_SDK_VERSION)
+ go mod tidy || true # TODO: remove this
diff --git a/apps/secret/Makefile b/apps/secret/Makefile
index d829f94e596..4826c9b871f 100644
--- a/apps/secret/Makefile
+++ b/apps/secret/Makefile
@@ -1,22 +1,4 @@
-APP_SDK_VERSION := v0.39.2
-APP_SDK_DIR := $(shell go env GOPATH)/bin/app-sdk-$(APP_SDK_VERSION)
-APP_SDK_BIN := $(APP_SDK_DIR)/grafana-app-sdk
-
-.PHONY: install-app-sdk
-install-app-sdk: $(APP_SDK_BIN) ## Install the Grafana App SDK
-
-$(APP_SDK_BIN):
- @echo "Installing Grafana App SDK version $(APP_SDK_VERSION)"
- @mkdir -p $(APP_SDK_DIR)
- # The only way to install specific versions of binaries using `go install`
- # is by setting GOBIN to the directory you want to install the binary to.
- GOBIN=$(APP_SDK_DIR) go install github.com/grafana/grafana-app-sdk/cmd/grafana-app-sdk@$(APP_SDK_VERSION)
- @touch $@
-
-.PHONY: update-app-sdk
-update-app-sdk: ## Update the Grafana App SDK dependency in go.mod
- go get github.com/grafana/grafana-app-sdk@$(APP_SDK_VERSION)
- go mod tidy
+include ../sdk.mk
.PHONY: generate
generate: install-app-sdk update-app-sdk ## Run Grafana App SDK code generation
@@ -26,4 +8,5 @@ generate: install-app-sdk update-app-sdk ## Run Grafana App SDK code generation
--grouping=group \
--defencoding=none \
--noschemasinmanifest \
- --postprocess
\ No newline at end of file
+ --postprocess \
+ --useoldmanifestkinds
\ No newline at end of file
diff --git a/apps/secret/go.mod b/apps/secret/go.mod
index 0c6f4df1e16..bd2ef50ab1b 100644
--- a/apps/secret/go.mod
+++ b/apps/secret/go.mod
@@ -1,37 +1,39 @@
module github.com/grafana/grafana/apps/secret
-go 1.24.4
+go 1.24.5
require (
- github.com/grafana/grafana-app-sdk v0.39.2
+ github.com/grafana/grafana-app-sdk v0.40.0
github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250710134100-1f3dc0533caf
github.com/stretchr/testify v1.10.0
google.golang.org/grpc v1.73.0
google.golang.org/protobuf v1.36.6
gopkg.in/yaml.v3 v3.0.1
- k8s.io/apimachinery v0.33.2
+ k8s.io/apimachinery v0.33.3
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff
- k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738
+ k8s.io/utils v0.0.0-20241210054802-24370beab758
)
require (
github.com/beorn7/perks v1.0.1 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
- github.com/emicklei/go-restful/v3 v3.11.0 // indirect
+ github.com/emicklei/go-restful/v3 v3.12.1 // indirect
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/getkin/kin-openapi v0.132.0 // indirect
- github.com/go-logr/logr v1.4.2 // indirect
+ github.com/go-logr/logr v1.4.3 // indirect
github.com/go-openapi/jsonpointer v0.21.0 // indirect
github.com/go-openapi/jsonreference v0.21.0 // indirect
github.com/go-openapi/swag v0.23.0 // indirect
github.com/go-test/deep v1.1.1 // indirect
github.com/gogo/protobuf v1.3.2 // indirect
github.com/google/gnostic-models v0.6.9 // indirect
- github.com/grafana/grafana-app-sdk/logging v0.39.1 // indirect
+ github.com/grafana/grafana-app-sdk/logging v0.39.3 // indirect
+ github.com/hashicorp/errwrap v1.1.0 // indirect
+ github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
- github.com/mailru/easyjson v0.7.7 // indirect
+ github.com/mailru/easyjson v0.9.0 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
@@ -42,13 +44,14 @@ require (
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/client_golang v1.22.0 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
- github.com/prometheus/common v0.64.0 // indirect
+ github.com/prometheus/common v0.65.0 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/x448/float16 v0.8.4 // indirect
- go.opentelemetry.io/otel v1.36.0 // indirect
- go.opentelemetry.io/otel/sdk/metric v1.36.0 // indirect
- go.opentelemetry.io/otel/trace v1.36.0 // indirect
+ go.opentelemetry.io/otel v1.37.0 // indirect
+ go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect
+ go.opentelemetry.io/otel/trace v1.37.0 // indirect
+ go.yaml.in/yaml/v2 v2.4.2 // indirect
golang.org/x/net v0.41.0 // indirect
golang.org/x/oauth2 v0.30.0 // indirect
golang.org/x/sys v0.33.0 // indirect
@@ -57,10 +60,10 @@ require (
golang.org/x/time v0.11.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
- k8s.io/client-go v0.33.2 // indirect
+ k8s.io/client-go v0.33.3 // indirect
k8s.io/klog/v2 v2.130.1 // indirect
- sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
+ sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
sigs.k8s.io/randfill v1.0.0 // indirect
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect
- sigs.k8s.io/yaml v1.4.0 // indirect
+ sigs.k8s.io/yaml v1.5.0 // indirect
)
diff --git a/apps/secret/go.sum b/apps/secret/go.sum
index fb88ea01837..0e4f4908526 100644
--- a/apps/secret/go.sum
+++ b/apps/secret/go.sum
@@ -6,14 +6,14 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs
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/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
-github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU=
+github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E=
github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ=
github.com/getkin/kin-openapi v0.132.0 h1:3ISeLMsQzcb5v26yeJrBcdTCEQTag36ZjaGk7MIRUwk=
github.com/getkin/kin-openapi v0.132.0/go.mod h1:3OlG51PCYNsPByuiMB0t4fjnNlIDnaEDsjiKUV8nL58=
-github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
-github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
+github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ=
@@ -36,12 +36,17 @@ github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/grafana/grafana-app-sdk v0.39.2 h1:ymfr+1318t+JC9U2OYrzVpGmNG/aJONUmFFu/G98Xh8=
-github.com/grafana/grafana-app-sdk v0.39.2/go.mod h1:t0m6q561lpoHQCixS9LUHFUhUzDClzNtm7BH60gHVSY=
-github.com/grafana/grafana-app-sdk/logging v0.39.1 h1:lI5rbrheuwVPuyIM6LIuEYOCSpgmXahfKtqeMyhbGPU=
-github.com/grafana/grafana-app-sdk/logging v0.39.1/go.mod h1:WhDENSnaGHtyVVwZGVnAR7YLvh2xlLDYR3D7E6h7XVk=
+github.com/grafana/grafana-app-sdk v0.40.0 h1:KilbCFMYox2cnIi1W6ql7W+n9kms/NvWlBPM1m4Q4mg=
+github.com/grafana/grafana-app-sdk v0.40.0/go.mod h1:fn943JEM0CR3mY/Gd3816MUcpob5xnKc8MoojnbMjYY=
+github.com/grafana/grafana-app-sdk/logging v0.39.3 h1:mMrcYahnoRu7blKyL/ZVcgv7WCiI2CqxODYh8tBFUgY=
+github.com/grafana/grafana-app-sdk/logging v0.39.3/go.mod h1:otUD9XpJD7A5sCLb8mcs9hIXGdeV6lnhzVwe747g4RU=
github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250710134100-1f3dc0533caf h1:BBGDHffvVNLoYQlXEpbXcxE0vbpq7pm/8OWF5I+UDZg=
github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250710134100-1f3dc0533caf/go.mod h1:eAlOam2uWhrsEZlOoAr7XZ9hbBP7SyYGYn31/aQAPs8=
+github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
+github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
+github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
+github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
@@ -56,8 +61,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
-github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
-github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=
+github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
@@ -82,8 +87,8 @@ github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/
github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0=
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
-github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
-github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
+github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE=
+github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
@@ -104,16 +109,20 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
-go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg=
-go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
-go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE=
-go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs=
-go.opentelemetry.io/otel/sdk v1.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs=
-go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY=
-go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis=
-go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4=
-go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w=
-go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
+go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
+go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
+go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
+go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
+go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
+go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
+go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
+go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
+go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
+go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
+go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
+go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
+go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE=
+go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
@@ -166,24 +175,25 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-k8s.io/api v0.33.2 h1:YgwIS5jKfA+BZg//OQhkJNIfie/kmRsO0BmNaVSimvY=
-k8s.io/api v0.33.2/go.mod h1:fhrbphQJSM2cXzCWgqU29xLDuks4mu7ti9vveEnpSXs=
-k8s.io/apimachinery v0.33.2 h1:IHFVhqg59mb8PJWTLi8m1mAoepkUNYmptHsV+Z1m5jY=
-k8s.io/apimachinery v0.33.2/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
-k8s.io/client-go v0.33.2 h1:z8CIcc0P581x/J1ZYf4CNzRKxRvQAwoAolYPbtQes+E=
-k8s.io/client-go v0.33.2/go.mod h1:9mCgT4wROvL948w6f6ArJNb7yQd7QsvqavDeZHvNmHo=
+k8s.io/api v0.33.3 h1:SRd5t//hhkI1buzxb288fy2xvjubstenEKL9K51KBI8=
+k8s.io/api v0.33.3/go.mod h1:01Y/iLUjNBM3TAvypct7DIj0M0NIZc+PzAHCIo0CYGE=
+k8s.io/apimachinery v0.33.3 h1:4ZSrmNa0c/ZpZJhAgRdcsFcZOw1PQU1bALVQ0B3I5LA=
+k8s.io/apimachinery v0.33.3/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
+k8s.io/client-go v0.33.3 h1:M5AfDnKfYmVJif92ngN532gFqakcGi6RvaOF16efrpA=
+k8s.io/client-go v0.33.3/go.mod h1:luqKBQggEf3shbxHY4uVENAxrDISLOarxpTKMiUuujg=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4=
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo=
+k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0=
+k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW1TdblaLVAc=
sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
-sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
+sigs.k8s.io/yaml v1.5.0 h1:M10b2U7aEUY6hRtU870n2VTPgR5RZiL/I6Lcc2F4NUQ=
+sigs.k8s.io/yaml v1.5.0/go.mod h1:wZs27Rbxoai4C0f8/9urLZtZtF3avA3gKvGyPdDqTO4=
diff --git a/apps/secret/kinds/keeper.cue b/apps/secret/kinds/keeper.cue
index 117e3bbd8a3..65eab07afc0 100644
--- a/apps/secret/kinds/keeper.cue
+++ b/apps/secret/kinds/keeper.cue
@@ -7,7 +7,6 @@ keeper: {
pluralName: "Keepers"
current: "v1beta1"
scope: "Namespaced"
- current: "v1beta1"
codegen: {
ts: {
enabled: false
diff --git a/apps/secret/kinds/securevalue.cue b/apps/secret/kinds/securevalue.cue
index 6bed093f46d..d37a88fce52 100644
--- a/apps/secret/kinds/securevalue.cue
+++ b/apps/secret/kinds/securevalue.cue
@@ -7,7 +7,6 @@ securevalue: {
pluralName: "SecureValues"
current: "v1beta1"
scope: "Namespaced"
- current: "v1beta1"
codegen: {
ts: {
enabled: false
diff --git a/apps/secret/pkg/apis/secret_manifest.go b/apps/secret/pkg/apis/secret_manifest.go
index 12138bbf57b..e8ff6dbca3a 100644
--- a/apps/secret/pkg/apis/secret_manifest.go
+++ b/apps/secret/pkg/apis/secret_manifest.go
@@ -7,6 +7,7 @@ package apis
import (
"fmt"
+ "strings"
"github.com/grafana/grafana-app-sdk/app"
"github.com/grafana/grafana-app-sdk/resource"
@@ -19,25 +20,23 @@ var ()
var appManifestData = app.ManifestData{
AppName: "secret",
Group: "secret.grafana.app",
- Kinds: []app.ManifestKind{
+ Versions: []app.ManifestVersion{
{
- Kind: "SecureValue",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
+ Name: "v1beta1",
+ Served: true,
+ Kinds: []app.ManifestVersionKind{
{
- Name: "v1beta1",
+ Kind: "SecureValue",
+ Plural: "SecureValues",
+ Scope: "Namespaced",
+ Conversion: false,
},
- },
- },
- {
- Kind: "Keeper",
- Scope: "Namespaced",
- Conversion: false,
- Versions: []app.ManifestKindVersion{
{
- Name: "v1beta1",
+ Kind: "Keeper",
+ Plural: "Keepers",
+ Scope: "Namespaced",
+ Conversion: false,
},
},
},
@@ -63,3 +62,16 @@ func ManifestGoTypeAssociator(kind, version string) (goType resource.Kind, exist
goType, exists = kindVersionToGoType[fmt.Sprintf("%s/%s", kind, version)]
return goType, exists
}
+
+var customRouteToGoResponseType = map[string]any{}
+
+// ManifestCustomRouteResponsesAssociator returns the associated response go type for a given kind, version, custom route path, and method, if one exists.
+// kind may be empty for custom routes which are not kind subroutes. Leading slashes are removed from subroute paths.
+// If there is no association for the provided kind, version, custom route path, and method, exists will return false.
+func ManifestCustomRouteResponsesAssociator(kind, version, path, verb string) (goType any, exists bool) {
+ if len(path) > 0 && path[0] == '/' {
+ path = path[1:]
+ }
+ goType, exists = customRouteToGoResponseType[fmt.Sprintf("%s|%s|%s|%s", version, kind, path, strings.ToUpper(verb))]
+ return goType, exists
+}
diff --git a/conf/defaults.ini b/conf/defaults.ini
index ccd2ba2d73a..889677b651a 100644
--- a/conf/defaults.ini
+++ b/conf/defaults.ini
@@ -992,7 +992,7 @@ session_duration = "15m"
# Set the plugins that will receive AWS settings for each request (via plugin context)
# By default this will include all Grafana Labs owned AWS plugins, or those that make use of AWS settings (ElasticSearch, Prometheus).
-forward_settings_to_plugins = cloudwatch, grafana-athena-datasource, grafana-redshift-datasource, grafana-x-ray-datasource, grafana-timestream-datasource, grafana-iot-sitewise-datasource, grafana-iot-twinmaker-app, grafana-opensearch-datasource, aws-datasource-provisioner, elasticsearch, prometheus, grafana-amazonprometheus-datasource, grafana-aurora-datasource
+forward_settings_to_plugins = cloudwatch, grafana-athena-datasource, grafana-redshift-datasource, grafana-x-ray-datasource, grafana-timestream-datasource, grafana-iot-sitewise-datasource, grafana-iot-twinmaker-datasource, grafana-opensearch-datasource, aws-datasource-provisioner, elasticsearch, prometheus, grafana-amazonprometheus-datasource, grafana-aurora-datasource
#################################### Azure ###############################
[azure]
@@ -2016,6 +2016,7 @@ enable =
[feature_toggles.openfeature]
# This is EXPERIMENTAL. Please, do not use this section
+enable_api = true
provider = static
[feature_toggles.openfeature.context]
@@ -2170,6 +2171,8 @@ frontend_poll_interval = 2s
# With "paused", all Alert Rules will be created in Paused state. This is helpful to avoid double notifications.
# With "unchanged", all Alert Rules will be created with the pause state unchanged coming from the source instance.
alert_rules_state = "paused"
+# Either "db" to store snapshots in the database or "fs" to store in the file system.
+resource_storage_type = "db"
###################################### Secrets Manager ######################################
[secrets_manager]
diff --git a/conf/sample.ini b/conf/sample.ini
index 238162d2590..30e5bb42f6a 100644
--- a/conf/sample.ini
+++ b/conf/sample.ini
@@ -2068,6 +2068,8 @@ default_datasource_uid =
# With "paused", all Alert Rules will be created in Paused state. This is helpful to avoid double notifications.
# With "unchanged", all Alert Rules will be created with the pause state unchanged coming from the source instance.
;alert_rules_state = "paused"
+# Either "db" to store snapshots in the database or "fs" to store in the file system.
+;resource_storage_type = "db"
###################################### Secrets Manager ######################################
[secrets_manager]
diff --git a/contribute/ISSUE_TRIAGE.md b/contribute/ISSUE_TRIAGE.md
index b856798fb5c..b8b669b27b5 100644
--- a/contribute/ISSUE_TRIAGE.md
+++ b/contribute/ISSUE_TRIAGE.md
@@ -234,7 +234,6 @@ In case there is an uncertainty around the prioritization of an issue, please as
**Critical bugs**
1. If a bug has been categorized and any of the following criteria apply, the bug should be labeled as critical and must be actively worked on as someone's top priority right now:
-
- Results in any data loss
- Critical security or performance issues
- Problem that makes a feature unusable
diff --git a/contribute/architecture/k8s-inspired-backend-arch.md b/contribute/architecture/k8s-inspired-backend-arch.md
index 520ebcfc559..84197d93d85 100644
--- a/contribute/architecture/k8s-inspired-backend-arch.md
+++ b/contribute/architecture/k8s-inspired-backend-arch.md
@@ -14,22 +14,18 @@ The end goal is for the Resource APIs to become the only interface for managing
## 1. Key Differences from Legacy API Endpoints
- **URL structure & versioning:**
-
- **Resource APIs:** Follow Kubernetes conventions (`/apis///namespaces///`). Includes explicit API versions (e.g., `v0alpha1`, `v1`, `v2beta1`) in the path, allowing for controlled evolution and multiple versions of a resource API to co-exist.
- **Legacy APIs:** Variable path structures (e.g., `/api/dashboards/uid/:uid`, `/api/ruler/grafana/api/v1/rules/:uid/:uid`). Less explicit versioning.
- **Resource schemas:**
-
- **Resource APIs:** Each resource has a well-defined schema (`spec`) and is wrapped with an envelope with common metadata, all APIs come with an always-in-sync OpenAPI spec.
- **Legacy APIs:** Structures vary
- **Namespacing / org context:**
-
- **Resource APIs:** Uses explicit namespaces in the path (`/namespaces//...`) mapping to Grafana Organization IDs in OSS/Enterprise and Grafana Cloud Stack IDs in Grafana Cloud for scoping.
- **Legacy APIs:** Org context determined implicitly (session, API key), not usually part of the URL structure.
- **Consistency of convenience features:**
-
- **Resource APIs:** Convenience features such as resource history, restore and observability-as-code tooling come out of the box; a single implementation of convenience features works across all resources because of the standardization
- **Legacy APIs:** Different APIs support different convenience features; implementations are feature-specific
diff --git a/contribute/developer-guide.md b/contribute/developer-guide.md
index f13f7ffccb3..45805f71fb3 100644
--- a/contribute/developer-guide.md
+++ b/contribute/developer-guide.md
@@ -101,11 +101,12 @@ If you want to contribute to any of the plugins listed below (that are found wit
- grafana-postgresql-datasource
- grafana-pyroscope-datasource
- grafana-testdata-datasource
-- jaegar
+- jaeger
- mysql
- parca
- tempo
- zipkin
+- loki
To build and watch all these plugins you can run the following command. Note this can be quite resource intensive as it will start separate build processes for each plugin.
@@ -119,6 +120,16 @@ If, instead, you would like to build and watch a specific plugin you can run the
yarn workspace dev
```
+If you want to run multiple specific plugins, you can use the following command.
+
+```
+yarn nx run-many -t dev --projects="@grafana-plugins/grafana-azure-monitor-datasource,@grafana-plugins/jaeger"
+```
+
+If you're unsure of the name of the plugins you'd like to run you can query nx with the following command to get a list of all plugins:
+
+`yarn nx show projects --projects="@grafana-plugins/*"`
+
Next, we'll explain how to build and run the web server that serves these frontend assets.
### Backend
@@ -251,18 +262,20 @@ Each version of Playwright needs specific versions of browser binaries to operat
yarn playwright install chromium
```
-To run all tests in a headless Chromium browser and display results in the terminal. This assumes you have Grafana running on port 3000.
+The following script starts a Grafana [development server](https://github.com/grafana/grafana/blob/main/scripts/grafana-server/start-server) (same server that is being used when running e2e tests in CI) on port 3001 and runs all the Playwright tests. The development server is provisioned with the [devenv](https://github.com/grafana/grafana/blob/main/contribute/developer-guide.md#add-data-sources) dashboards, data sources and apps.
```
yarn e2e:playwright
```
-The following script starts a Grafana [development server](https://github.com/grafana/grafana/blob/main/scripts/grafana-server/start-server) (same server that is being used when running e2e tests in Drone CI) on port 3001 and runs the Playwright tests. The development server is provisioned with the [devenv](https://github.com/grafana/grafana/blob/main/contribute/developer-guide.md#add-data-sources) dashboards, data sources and apps.
+You can run against an arbitrary instance by setting the `GRAFANA_URL` environment variable:
```
-yarn e2e:playwright:server
+GRAFANA_URL=http://localhost:3000 yarn e2e:playwright
```
+Note this will not start a development server, so you must ensure that Grafana is running and accessible at the specified URL.
+
## Configure Grafana for development
The default configuration, `defaults.ini`, is located in the `conf` directory.
diff --git a/contribute/feature-toggles.md b/contribute/feature-toggles.md
index 2a5899e166b..8e81c9c0c11 100644
--- a/contribute/feature-toggles.md
+++ b/contribute/feature-toggles.md
@@ -15,3 +15,12 @@ Examples:
- [Backend](https://github.com/grafana/grafana/blob/feb2b5878b3e3ec551d64872c35edec2a0187812/pkg/services/authn/clients/session.go#L57): Use the `IsEnabled` function and pass in your feature toggle.
- [Frontend](https://github.com/grafana/grafana/blob/feb2b5878b3e3ec551d64872c35edec2a0187812/public/app/features/search/service/folders.ts#L14): Check the config for your feature toggle.
+
+## Enabling toggles in development
+
+Add the feature toggle to the feature_toggle section in your custom.ini, for example:
+
+```
+[feature_toggles]
+localeFormatPreference=true
+```
diff --git a/contribute/style-guides/e2e-plugins.md b/contribute/style-guides/e2e-plugins.md
index 8d6ffaca61a..e3fafa36fcf 100644
--- a/contribute/style-guides/e2e-plugins.md
+++ b/contribute/style-guides/e2e-plugins.md
@@ -32,10 +32,12 @@ You can add Playwright end-to-end tests for plugins to the [`e2e-playwright/plug
- `yarn e2e:playwright` runs all Playwright tests. Optionally, you can provide the `--project mysql` argument to run tests in a specific project.
- The `yarn e2e:playwright` script assumes you have Grafana running on `localhost:3000`. You may change this with an environment variable:
+ The `yarn e2e:playwright` command starts a Grafana [development server](https://github.com/grafana/grafana/blob/main/scripts/grafana-server/start-server) on port 3001 and runs the Playwright tests.
- `HOST=127.0.0.1 PORT=3001 yarn e2e:playwright`
+ You can run against an arbitrary instance by setting the `GRAFANA_URL` environment variable:
- The `yarn e2e:playwright:server` starts a Grafana [development server](https://github.com/grafana/grafana/blob/main/scripts/grafana-server/start-server) on port 3001 and runs the Playwright tests.
+ `GRAFANA_URL=http://localhost:3000 yarn e2e:playwright`
+
+ Note this will not start a development server, so you must ensure that Grafana is running and accessible at the specified URL.
- You can provision the development server with the [devenv](https://github.com/grafana/grafana/blob/main/contribute/developer-guide.md#add-data-sources) dashboards, data sources, and apps.
diff --git a/devenv/dev-dashboards/panel-table/table_kitchen_sink.json b/devenv/dev-dashboards/panel-table/table_kitchen_sink.json
new file mode 100644
index 00000000000..c92924966ce
--- /dev/null
+++ b/devenv/dev-dashboards/panel-table/table_kitchen_sink.json
@@ -0,0 +1,528 @@
+{
+ "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": 138,
+ "links": [],
+ "panels": [
+ {
+ "datasource": {
+ "type": "grafana-testdata-datasource",
+ "uid": "PD8C576611E62080A"
+ },
+ "fieldConfig": {
+ "defaults": {
+ "color": {
+ "mode": "thresholds"
+ },
+ "custom": {
+ "align": "auto",
+ "cellOptions": {
+ "type": "auto",
+ "wrapText": false
+ },
+ "filterable": true,
+ "inspect": false,
+ "wrapHeaderText": false
+ },
+ "fieldMinMax": true,
+ "links": [],
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "color": "green",
+ "value": 0
+ },
+ {
+ "color": "red",
+ "value": 80
+ }
+ ]
+ }
+ },
+ "overrides": [
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "A"
+ },
+ "properties": [
+ {
+ "id": "custom.cellOptions",
+ "value": {
+ "mode": "lcd",
+ "type": "gauge"
+ }
+ },
+ {
+ "id": "min",
+ "value": 0
+ },
+ {
+ "id": "max",
+ "value": 100
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Info"
+ },
+ "properties": [
+ {
+ "id": "links",
+ "value": [
+ {
+ "targetBlank": true,
+ "title": "Google this term",
+ "url": "https://google.com/search?q=${__value:percentencode}"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Min"
+ },
+ "properties": []
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Max"
+ },
+ "properties": []
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "State"
+ },
+ "properties": []
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Time"
+ },
+ "properties": [
+ {
+ "id": "custom.cellOptions",
+ "value": {
+ "type": "auto"
+ }
+ },
+ {
+ "id": "unit",
+ "value": "dateTimeFromNow"
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Image"
+ },
+ "properties": [
+ {
+ "id": "custom.cellOptions",
+ "value": {
+ "alt": "${__value}",
+ "type": "image"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byRegexp",
+ "options": "/(Time|Min|Max|Info|State|Image)/"
+ },
+ "properties": [
+ {
+ "id": "custom.width",
+ "value": 110
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Info"
+ },
+ "properties": [
+ {
+ "id": "custom.cellOptions",
+ "value": {
+ "type": "color-text"
+ }
+ },
+ {
+ "id": "mappings",
+ "value": [
+ {
+ "options": {
+ "pattern": "up",
+ "result": {
+ "color": "green",
+ "index": 0
+ }
+ },
+ "type": "regex"
+ },
+ {
+ "options": {
+ "pattern": "down",
+ "result": {
+ "color": "red",
+ "index": 1
+ }
+ },
+ "type": "regex"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Min"
+ },
+ "properties": [
+ {
+ "id": "custom.cellOptions",
+ "value": {
+ "mode": "basic",
+ "type": "color-background"
+ }
+ },
+ {
+ "id": "color",
+ "value": {
+ "fixedColor": "blue",
+ "mode": "continuous-YlRd"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Max"
+ },
+ "properties": [
+ {
+ "id": "custom.cellOptions",
+ "value": {
+ "mode": "gradient",
+ "type": "color-background"
+ }
+ },
+ {
+ "id": "color",
+ "value": {
+ "mode": "continuous-purples"
+ }
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "State"
+ },
+ "properties": [
+ {
+ "id": "displayName",
+ "value": "State"
+ },
+ {
+ "id": "custom.hidden",
+ "value": true
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Long Text"
+ },
+ "properties": [
+ {
+ "id": "custom.cellOptions",
+ "value": {
+ "type": "auto",
+ "wrapText": true
+ }
+ },
+ {
+ "id": "custom.width",
+ "value": 300
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Pills"
+ },
+ "properties": [
+ {
+ "id": "custom.cellOptions",
+ "value": {
+ "type": "pill"
+ }
+ },
+ {
+ "id": "custom.width",
+ "value": 120
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Data Link"
+ },
+ "properties": [
+ {
+ "id": "custom.cellOptions",
+ "value": {
+ "type": "data-links"
+ }
+ },
+ {
+ "id": "links",
+ "value": [
+ {
+ "targetBlank": true,
+ "title": "Product",
+ "url": "${__value.text}"
+ },
+ {
+ "targetBlank": true,
+ "title": "Grafana",
+ "url": "https://grafana.com"
+ }
+ ]
+ },
+ {
+ "id": "custom.width",
+ "value": 180
+ }
+ ]
+ },
+ {
+ "matcher": {
+ "id": "byName",
+ "options": "Gauge"
+ },
+ "properties": []
+ }
+ ]
+ },
+ "gridPos": {
+ "h": 15,
+ "w": 24,
+ "x": 0,
+ "y": 0
+ },
+ "id": 1,
+ "options": {
+ "cellHeight": "sm",
+ "footer": {
+ "countRows": false,
+ "enablePagination": false,
+ "fields": [
+ "Min",
+ "Max"
+ ],
+ "reducer": [
+ "max"
+ ],
+ "show": true
+ },
+ "frameIndex": 0,
+ "showHeader": true,
+ "sortBy": []
+ },
+ "pluginVersion": "12.1.0-pre",
+ "targets": [
+ {
+ "datasource": {
+ "type": "grafana-testdata-datasource",
+ "uid": "PD8C576611E62080A"
+ },
+ "refId": "A",
+ "scenarioId": "random_walk_table"
+ },
+ {
+ "csvContent": "Info,Image,Pills,Data Link,Long Text\ndown,https://placecats.com/millie/200/400,hello,https://grafana.com,\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse tempus et augue et lacinia. Interdum et malesuada fames ac ante ipsum primis in faucibus. Donec eu pretium tortor. Cras venenatis sapien sed mauris gravida, ut scelerisque est fringilla. Cras lorem diam, facilisis nec malesuada in, vulputate vel enim. Etiam fringilla nisi quis felis blandit tincidunt. Cras id lacus ornare, ullamcorper nisl eget, bibendum odio. Pellentesque imperdiet, leo a imperdiet venenatis, ligula risus venenatis quam, vel euismod magna nisi sit amet leo.\"\nup,https://placecats.com/neo/200/400,\"[1,2,3,\"\"foo\"\",\"\"bar\"\"]\",https://grafana.com/solutions/kubernetes/,\"Sed imperdiet eget diam sit amet fringilla. Curabitur quis lacus blandit, mollis diam non, accumsan tortor. Aliquam ac tellus eget dui facilisis tempor eu id nulla. Maecenas ultrices turpis eu elementum imperdiet. Fusce eget rhoncus mi, et egestas lectus. Mauris facilisis auctor enim sed malesuada. Maecenas placerat ultricies metus vitae viverra. In hac habitasse platea dictumst. Mauris ipsum nisl, dictum eu aliquam eleifend, rutrum id orci. Nullam eget dui et odio eleifend porttitor.\"\nup fast,https://placecats.com/bella/200/400,\"foo,1,4,beep\",https://k6.io/,\"Proin ac libero vulputate ex vulputate pharetra ut vel lacus. Phasellus quis dolor sed leo finibus scelerisque. Ut vel finibus leo, sed viverra ipsum. Suspendisse vitae rutrum arcu. Donec sed tellus vel lectus bibendum vestibulum. Sed eu felis non velit dictum pulvinar eu et leo. Aenean et dignissim arcu. Nam luctus at neque quis efficitur. Fusce tempus at nibh a imperdiet. Nullam malesuada ac magna at facilisis. Duis pretium aliquam eros. Donec pharetra dignissim dolor non bibendum. Ut gravida mi id urna tempus, at ullamcorper felis vulputate. Duis congue augue ex, sed finibus leo ornare ut. Mauris non quam sodales, dignissim lorem eget, tincidunt mauris. Aliquam ut velit auctor, vestibulum metus sed, mollis massa.\"\ndown fast,https://placecats.com/neo_2/200/400,\"foo,bar,baz,a longer one,bim\",https://grafana.com/products/cloud/,\"Nullam in pulvinar justo. Nunc dictum arcu ac pellentesque bibendum. Sed in erat turpis. Vestibulum eu orci ac ligula lobortis tempus. Fusce consectetur feugiat magna, eu tempor nibh vestibulum ac. Aliquam erat volutpat. Vivamus sit amet viverra enim. Quisque mollis odio nulla, nec vulputate sem placerat in. Etiam dolor sapien, pulvinar in accumsan at, consequat eget nisi. Nunc condimentum neque magna, congue consectetur dui efficitur interdum. Nam lobortis fringilla maximus. Vestibulum eu dui a velit condimentum eleifend consequat nec lectus.\"",
+ "datasource": {
+ "type": "grafana-testdata-datasource",
+ "uid": "PD8C576611E62080A"
+ },
+ "refId": "B",
+ "scenarioId": "csv_content"
+ }
+ ],
+ "title": "Table - Kitchen Sink",
+ "transformations": [
+ {
+ "id": "joinByField",
+ "options": {
+ "byField": "Info",
+ "mode": "outerTabular"
+ }
+ },
+ {
+ "id": "organize",
+ "options": {
+ "excludeByName": {
+ "A": false
+ },
+ "includeByName": {},
+ "indexByName": {
+ "A": 9,
+ "Data Link": 8,
+ "Image": 5,
+ "Info": 1,
+ "Long Text": 7,
+ "Max A": 3,
+ "Min A": 2,
+ "Pills": 6,
+ "State A": 4,
+ "Time A": 0
+ },
+ "orderBy": [],
+ "orderByMode": "manual",
+ "renameByName": {
+ "A": "Gauge",
+ "Info": "",
+ "Max A": "Max",
+ "Min A": "Min",
+ "State A": "State",
+ "Time": "Some really long title that requires wrapping",
+ "Time A": "Time",
+ "img_url": "Cat"
+ }
+ }
+ }
+ ],
+ "type": "table"
+ },
+ {
+ "id": 2,
+ "type": "table",
+ "title": "Empty Table Panel",
+ "gridPos": {
+ "x": 0,
+ "y": 0,
+ "h": 6,
+ "w": 24
+ },
+ "fieldConfig": {
+ "defaults": {
+ "custom": {
+ "align": "auto",
+ "cellOptions": {
+ "type": "auto"
+ },
+ "inspect": false,
+ "wrapHeaderText": false
+ },
+ "mappings": [],
+ "thresholds": {
+ "mode": "absolute",
+ "steps": [
+ {
+ "value": null,
+ "color": "green"
+ },
+ {
+ "value": 80,
+ "color": "red"
+ }
+ ]
+ },
+ "color": {
+ "mode": "thresholds"
+ }
+ },
+ "overrides": []
+ },
+ "pluginVersion": "12.1.0-pre",
+ "targets": [
+ {
+ "scenarioId": "csv_content",
+ "refId": "A",
+ "csvContent": "a,b,c"
+ }
+ ],
+ "datasource": {
+ "uid": "PD8C576611E62080A",
+ "type": "grafana-testdata-datasource"
+ },
+ "options": {
+ "showHeader": true,
+ "cellHeight": "sm",
+ "footer": {
+ "show": false,
+ "reducer": [
+ "sum"
+ ],
+ "countRows": false,
+ "fields": ""
+ }
+ }
+ }
+ ],
+ "preload": false,
+ "schemaVersion": 41,
+ "tags": [],
+ "templating": {
+ "list": [
+ {
+ "baseFilters": [],
+ "datasource": {
+ "type": "grafana-testdata-datasource",
+ "uid": "PD8C576611E62080A"
+ },
+ "filters": [],
+ "name": "Filters",
+ "type": "adhoc"
+ }
+ ]
+ },
+ "time": {
+ "from": "now-6h",
+ "to": "now"
+ },
+ "timepicker": {},
+ "timezone": "",
+ "title": "Panel Tests - Table - Kitchen Sink",
+ "uid": "dcb9f5e9-8066-4397-889e-864b99555dbb",
+ "version": 2
+}
diff --git a/devenv/docker/blocks/prometheus_high_card/go.mod b/devenv/docker/blocks/prometheus_high_card/go.mod
index 32a39000351..53cd8058c27 100644
--- a/devenv/docker/blocks/prometheus_high_card/go.mod
+++ b/devenv/docker/blocks/prometheus_high_card/go.mod
@@ -1,6 +1,6 @@
module high-card
-go 1.24.4
+go 1.24.5
require github.com/prometheus/client_golang v1.22.0
diff --git a/devenv/docker/blocks/prometheus_utf8/go.mod b/devenv/docker/blocks/prometheus_utf8/go.mod
index ed5e88f860d..77bc82d2b2d 100644
--- a/devenv/docker/blocks/prometheus_utf8/go.mod
+++ b/devenv/docker/blocks/prometheus_utf8/go.mod
@@ -1,6 +1,6 @@
module utf8-support
-go 1.24.4
+go 1.24.5
require (
github.com/prometheus/client_golang v1.22.0
diff --git a/devenv/docker/blocks/stateful_webhook/Dockerfile b/devenv/docker/blocks/stateful_webhook/Dockerfile
index 42a1610a9a2..e6527450805 100644
--- a/devenv/docker/blocks/stateful_webhook/Dockerfile
+++ b/devenv/docker/blocks/stateful_webhook/Dockerfile
@@ -1,4 +1,4 @@
-FROM golang:1.24.4
+FROM golang:1.24.5
ADD main.go /go/src/webhook/main.go
diff --git a/devenv/frontend-service/README.md b/devenv/frontend-service/README.md
index c81008cb3b0..60acc1e134e 100644
--- a/devenv/frontend-service/README.md
+++ b/devenv/frontend-service/README.md
@@ -16,3 +16,13 @@ On top of the main Grafana development dependencies, you will need installed:
To start the stack, from the root of the Grafana project run `make frontend-service-up`. Tilt will orchestrate the webpack and docker builds, and then run the services with Docker compose. You can monitor it's progress and see logs with the URL to the Tilt console. Once done, you can access Grafana at `http://localhost:3000`.
Quitting the process will not stop the service from running. Run `make frontend-service-down` when done to shut down the docker containers.
+
+### Bootdata unavailable
+
+To simulate the `/bootdata` endpoint being available, there are special control URLs you can visit that use cookies to control behaviour:
+
+ - `/-/down` - Simulates the endpoint being unavailable for 60 seconds.
+ - `/-/down/:seconds` - Simulates the endpoint being unavailable for a custom number of seconds.
+ - `/-/up` - Restores the endpoint to being available.
+
+When unavailable, the API will return `HTTP 503 Service Unavailable` with a JSON payload.
\ No newline at end of file
diff --git a/devenv/frontend-service/backend.dockerfile b/devenv/frontend-service/backend.dockerfile
index bfc89735d1a..7326802d3a6 100644
--- a/devenv/frontend-service/backend.dockerfile
+++ b/devenv/frontend-service/backend.dockerfile
@@ -1,5 +1,5 @@
ARG BASE_IMAGE=alpine:3.21
-ARG GO_IMAGE=golang:1.24.4-alpine
+ARG GO_IMAGE=golang:1.24.5-alpine
# ----- Go build stage
FROM ${GO_IMAGE} AS go-dev-builder
diff --git a/devenv/frontend-service/build-grafana.sh b/devenv/frontend-service/build-grafana.sh
index 8b1ac338889..b3adbe16e1a 100644
--- a/devenv/frontend-service/build-grafana.sh
+++ b/devenv/frontend-service/build-grafana.sh
@@ -6,7 +6,7 @@ echo "Go build cache: $(go env GOCACHE), $(ls -1 $(go env GOCACHE) | wc -l) item
# Need to build version into the binary so plugin compatibility works correctly
VERSION=$(jq -r .version package.json)
-go build \
+go build -v \
-ldflags "-X main.version=${VERSION}" \
-gcflags "all=-N -l" \
-o ./bin/grafana ./pkg/cmd/grafana
diff --git a/devenv/frontend-service/nginx.conf b/devenv/frontend-service/nginx.conf
index 5927c492e53..26d6c1f9968 100644
--- a/devenv/frontend-service/nginx.conf
+++ b/devenv/frontend-service/nginx.conf
@@ -9,10 +9,29 @@ upstream frontend {
server frontend-service:3000;
}
+map "$request_method:$cookie_fs_unavailable" $reject_login {
+ default 0;
+ "POST:1" 1;
+}
+
server {
listen 80;
server_name _;
+ location ~ ^/-/down/?$ {
+ add_header Set-Cookie "fs_unavailable=true; Max-Age=60; Path=/; HttpOnly" always;
+ return 302 $scheme://$http_host/;
+ }
+
+ location ~ ^/-/down/(?\d+)/?$ {
+ add_header Set-Cookie "fs_unavailable=true; Max-Age=$age; Path=/; HttpOnly" always;
+ return 302 $scheme://$http_host/;
+ }
+
+ location ~ ^/-/up/?$ {
+ return 302 $scheme://$http_host/-/down/0;
+ }
+
# Special‐case POST /login to backend, GET to frontend
location = /login {
proxy_set_header Host $host;
@@ -20,6 +39,11 @@ server {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
+ if ($reject_login) {
+ add_header Content-Type application/json always;
+ return 503 '{"code":"Loading", "message": "Soon!"}';
+ }
+
if ($request_method = POST) {
proxy_pass http://backend;
break;
@@ -37,6 +61,11 @@ server {
# Cheat with app plugin paths and route them to the backend. These should come from
# the Plugin CDN
location ~ ^/(api|apis|bootdata|logout|public\/plugins\/grafana\-\w+\-app) {
+ if ($cookie_fs_unavailable) {
+ add_header Content-Type application/json always;
+ return 503 '{"code":"Loading", "message": "Soon!"}';
+ }
+
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
diff --git a/devenv/jsonnet/dev-dashboards.libsonnet b/devenv/jsonnet/dev-dashboards.libsonnet
index e25bdeeed09..d16f9b96c84 100644
--- a/devenv/jsonnet/dev-dashboards.libsonnet
+++ b/devenv/jsonnet/dev-dashboards.libsonnet
@@ -93,6 +93,7 @@
"rows-to-fields": (import '../dev-dashboards/transforms/rows-to-fields.json'),
"shared_queries": (import '../dev-dashboards/panel-common/shared_queries.json'),
"slow_queries_and_annotations": (import '../dev-dashboards/scenarios/slow_queries_and_annotations.json'),
+ "table_kitchen_sink": (import '../dev-dashboards/panel-table/table_kitchen_sink.json'),
"table_pagination": (import '../dev-dashboards/panel-table/table_pagination.json'),
"table_sparkline_cell": (import '../dev-dashboards/panel-table/table_sparkline_cell.json'),
"table_tests": (import '../dev-dashboards/panel-table/table_tests.json'),
diff --git a/devenv/local_cdn/default.conf b/devenv/local_cdn/default.conf
index e35c16ee146..0c37c5ff410 100644
--- a/devenv/local_cdn/default.conf
+++ b/devenv/local_cdn/default.conf
@@ -19,6 +19,6 @@ server {
add_header 'Access-Control-Allow-Headers' '*' always;
add_header 'Access-Control-Allow-Credentials' 'true' always;
- rewrite ^/grafana-oss/11.4.0-pre/public(.*)$ $1 last;
+ rewrite ^/grafana-oss/12.1.0-pre/public(.*)$ $1 last;
}
}
diff --git a/docs/sources/administration/correlations/use-variables-and-transformations/index.md b/docs/sources/administration/correlations/use-variables-and-transformations/index.md
index 6251d537352..8ba408e5b94 100644
--- a/docs/sources/administration/correlations/use-variables-and-transformations/index.md
+++ b/docs/sources/administration/correlations/use-variables-and-transformations/index.md
@@ -66,7 +66,6 @@ Instructions below show how to set up a link that can run metrics query for the
```
Two data sources are created: Source (emulating logs data source) and Target (emulating metrics data source):
-
- A correlation called “App metrics” is created targeting the Target data source with its UID.
- The label and description are provided as text
- Each correlation contains the following configuration:
diff --git a/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-ecs/index.md b/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-ecs/index.md
index c9192e585e6..1f37fa513eb 100644
--- a/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-ecs/index.md
+++ b/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-ecs/index.md
@@ -79,7 +79,6 @@ To configure Grafana for high availability:
In this task you configure Grafana Enterprise to validate the license with AWS instead of Grafana Labs.
1. In AWS IAM, create an access policy with the following permissions:
-
- `"license-manager:CheckoutLicense"`
- `"license-manager:ListReceivedLicenses"`
- `"license-manager:GetLicenseUsage"`
diff --git a/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-eks/index.md b/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-eks/index.md
index 5199690faa3..1d57566cd61 100644
--- a/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-eks/index.md
+++ b/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-eks/index.md
@@ -89,7 +89,6 @@ For more information on Grafana High Availability setup, refer to [Set up Grafan
In this task, you configure Grafana Enterprise to validate the license with AWS instead of Grafana Labs.
1. In AWS IAM, assign the following permissions to the Node IAM role (if you are using a Node Group), or the Pod Execution role (if you are using a Fargate profile):
-
- `"license-manager:CheckoutLicense"`
- `"license-manager:ListReceivedLicenses"`
- `"license-manager:GetLicenseUsage"`
@@ -100,7 +99,6 @@ In this task, you configure Grafana Enterprise to validate the license with AWS
For more information about AWS license permissions, refer to [Actions, resources, and condition keys for AWS License Manager](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awslicensemanager.html).
1. Choose **one** of the following options to update the [license_validation_type](../../../../setup-grafana/configure-grafana/enterprise-configuration/#license_validation_type) configuration to `aws`:
-
- **Option 1:** Use `kubectl edit configmap grafana` to edit `grafana.ini` add the following section to the configuration:
```
diff --git a/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-instance-outside-aws/index.md b/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-instance-outside-aws/index.md
index 9d1741d94a4..1399cde35f6 100644
--- a/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-instance-outside-aws/index.md
+++ b/docs/sources/administration/enterprise-licensing/activate-aws-marketplace-license/activate-license-on-instance-outside-aws/index.md
@@ -44,7 +44,6 @@ To install Grafana, refer to the documentation specific to your implementation.
To retrieve your license, Grafana Enterprise requires access to your AWS account and license information. To grant access, create an IAM user in AWS with access to the license, and pass its credentials as environment variables on the host or container where Grafana is running. These environment variables allow Grafana to retrieve license details from AWS.
1. In the AWS License Manager service, create an IAM policy with the following permissions:
-
- `"license-manager:CheckoutLicense"`
- `"license-manager:ListReceivedLicenses"`
- `"license-manager:GetLicenseUsage"`
@@ -93,7 +92,6 @@ To retrieve your license, Grafana Enterprise requires access to your AWS account
1. Attach the policy you created to the IAM user.
1. Add the following values as environment variables to the host or container running Grafana:
-
- AWS region
- IAM user's access key ID
- IAM user's secret access key
diff --git a/docs/sources/administration/grafana-advisor/_index.md b/docs/sources/administration/grafana-advisor/_index.md
index 28caf9b1953..38673e9e121 100644
--- a/docs/sources/administration/grafana-advisor/_index.md
+++ b/docs/sources/administration/grafana-advisor/_index.md
@@ -7,7 +7,6 @@ labels:
- oss
- cloud
- enterprise
- stage: experimental
keywords:
- grafana
- grafana advisor
@@ -17,7 +16,7 @@ keywords:
# Grafana Advisor
-{{< docs/experimental product="Grafana Advisor" featureFlag="grafanaAdvisor" >}}
+{{< docs/public-preview product="Grafana Advisor" featureFlag="grafanaAdvisor" >}}
## Overview
@@ -106,3 +105,100 @@ To resolve issues flagged by Grafana Advisor and maintain system reliability, fo
- **Immediate Action:** Address "Action needed" items promptly to ensure system reliability
- **Systematic Review:** After fixing flagged issues, use the "Refresh" button to confirm all checks pass
- **Proactive Updates:** Address plugin update recommendations under "Investigation needed" even if they haven't caused failures yet
+
+## How to create an alert based on Advisor results
+
+This guide walks you through creating a Grafana alert that monitors Advisor check results and triggers when failures are detected.
+
+### Step 1: Create a service account and token
+
+1. Navigate to **Administration → Users and access → Service accounts** in your Grafana instance
+2. Click **Add service account**
+3. Provide a name (for example, "advisor-alert-service-account")
+4. Set the role to **Admin** to ensure proper permissions
+5. Click **Create**
+6. In the service account details, click **Add service account token**
+7. Provide a token name and set an appropriate expiration date
+8. Click **Generate token**
+
+> **Important**: Copy the token value immediately and store it securely - you won't be able to see it again
+
+### Step 2: Set up the Grafana Infinity data source
+
+> **Important**: Use Infinity plugin >=v3.3.0 for the JQ parser used later.
+
+1. Go to **Connections → Add new connection**
+2. Search for "Infinity"
+3. If not installed, click **Install**. Wait for the plugin to be installed.
+4. From the plugin page, click **Add new data source**.
+5. Configure the data source:
+ - **Name**: Give it a descriptive name (e.g., "Advisor API")
+ - **Setup Authentication**: In the **Auth type**, select **Bearer Token**. In the **Auth details** section, paste the service account token from Step 1 and in the **Allowed hosts** section, write your Grafana app URL and click the "Add" button (e.g., `https://your-grafana-host.com`).
+6. Click **Save & test** to verify the connection
+
+### Step 3: Create the alert rule
+
+Now you have everything you need to create an alert based on Advisor results.
+
+1. Navigate to **Alerting → Alert rules**
+2. Click **New alert rule**
+3. Provide a rule name (e.g., "Advisor Failures Alert")
+
+#### Configure the query
+
+1. **Data source**: Select the Infinity data source created in Step 3
+2. Configure the query settings:
+ - **Type**: JSON
+ - **Parser**: JQ
+ - **Source**: URL
+ - **Format**: Table
+ - **Method**: GET
+ - **URL**: Get this from the Advisor interface:
+ - Visit the Advisor in your Grafana instance
+ - Open browser Developer Tools (F12) → Network tab
+ - Look for a request ending with `/checks`
+ - Copy the full URL (format: `https:///apis/advisor.grafana.app/v0alpha1/namespaces//checks`)
+
+#### Configure parsing options
+
+**Rows/Root** (paste this JQ expression):
+
+```jq
+.items | map({
+ type: .metadata.labels["advisor.grafana.app/type"],
+ creationTimestamp: .metadata.creationTimestamp,
+ failuresCount: (.status.report.failures | length)
+}) | group_by(.type) | map(sort_by(.creationTimestamp) | last)
+```
+
+This JQ query processes Grafana Advisor check data to get the most recent result for each check type. It transforms each check into a simplified object with type, timestamp, and failure count.
+The result is a clean array showing the current state of each check type (data source, plugin, configuration, etc.) with their failure counts, perfect for alerting when any type has failures > 0.
+
+**Columns** (add these three columns):
+
+- **Selector**: `creationTimestamp`, **Format**: Time
+- **Selector**: `failuresCount`, **Format**: Number
+- **Selector**: `type`, **Format**: String
+
+#### Optional: Filter by check type
+
+If you want to alert only for specific check types:
+
+1. In the **Computed columns, Filter, Group by** section
+2. Add a **Filter**: `type == "license"` (replace "license" with your desired check type)
+
+#### Set alert condition
+
+- **Alert condition**: Select "WHEN Last OF QUERY Is above 0"
+- This will trigger when any check type has failures.
+- Click on "Preview alert rule condition" to see the result of the query.
+
+#### Complete alert configuration
+
+Select your preferred evaluation (e.g. every 24 hours) and notification settings.
+
+### Step 4: Save the alert rule
+
+Click **Save** and check the alert is being triggered.
+
+Your alert is now configured to monitor Advisor results and notify you when failures are detected!
diff --git a/docs/sources/administration/migration-guide/cloud-migration-assistant.md b/docs/sources/administration/migration-guide/cloud-migration-assistant.md
index f6d349fb9a6..16bb16a93c4 100644
--- a/docs/sources/administration/migration-guide/cloud-migration-assistant.md
+++ b/docs/sources/administration/migration-guide/cloud-migration-assistant.md
@@ -136,7 +136,6 @@ After a snapshot is created, a list of resources appears with resource Type and
1. Use the assistant's real-time progress tracking to monitor the migration. The status changes to 'Uploaded to cloud' for resources successfully copied to the cloud.
From Grafana v12.0, you can group and sort resources during and after the migration:
-
- Click **Name** to sort resources alphabetically.
- Click **Type** to group and sort by resource type.
- Click **Status** to group and sort by upload status (pending upload, uploaded successfully, or experienced errors).
diff --git a/docs/sources/administration/migration-guide/manually-migrate-to-grafana-cloud.md b/docs/sources/administration/migration-guide/manually-migrate-to-grafana-cloud.md
index de111d5abb8..e68083eb4a0 100644
--- a/docs/sources/administration/migration-guide/manually-migrate-to-grafana-cloud.md
+++ b/docs/sources/administration/migration-guide/manually-migrate-to-grafana-cloud.md
@@ -84,7 +84,6 @@ Migration of plugins is the first step when transitioning from Grafana OSS/Enter
```
The command provided above will carry out an HTTP request to this endpoint and accomplish several tasks:
-
- It issues a GET request to the `/api/plugins` endpoint of your Grafana OSS/Enterprise instance to retrieve a list of installed plugins.
- It filters out the list to only include community plugins and those signed by external parties.
- It extracts the plugin ID and version before storing them in a `plugins.json` file.
@@ -111,7 +110,6 @@ Migration of plugins is the first step when transitioning from Grafana OSS/Enter
Replace `` with your Grafana Cloud Access Policy Token. To create a new one, refer to Grafana Cloud [access policies documentation](https://grafana.com/docs/grafana-cloud/account-management/authentication-and-permissions/access-policies/)
This script iterates through each plugin listed in the `plugins.json` file:
-
- It constructs a POST request for each plugin to add it to the specified Grafana Cloud instance.
- It reports back the response for each POST request to give you confirmation or information about any issues that occurred.
@@ -260,7 +258,6 @@ Grizzly does not currently support Reports and Playlists as a resource, so you c
```
The command provided above will carry out an HTTP request to this endpoint and accomplish several tasks:
-
- It fetches an array of all the playlists available in the Grafana OSS/Enterprise instance.
- It then iterates through each playlist to obtain the complete set of details.
- Finally, it stores each playlist's specification as separate JSON files within a directory named `playlists`
diff --git a/docs/sources/administration/plugin-management/_index.md b/docs/sources/administration/plugin-management/_index.md
index d396fc0825a..b7c674b4b18 100644
--- a/docs/sources/administration/plugin-management/_index.md
+++ b/docs/sources/administration/plugin-management/_index.md
@@ -249,7 +249,6 @@ To enable backend communication between plugins:
```
This is a comma-separated list that uses glob matching.
-
- To allow access to all plugins that have a backend:
```
diff --git a/docs/sources/alerting/alerting-rules/alerting-migration.md b/docs/sources/alerting/alerting-rules/alerting-migration.md
index d00ad4f003d..f07c874902d 100644
--- a/docs/sources/alerting/alerting-rules/alerting-migration.md
+++ b/docs/sources/alerting/alerting-rules/alerting-migration.md
@@ -111,7 +111,6 @@ To convert data source-managed alert rules to Grafana managed alerts:
2. Navigate to the Data source-managed alert rules section and click **Import to Grafana-managed rules**.
3. Choose the **Import source** from which you want to import rules:
-
- Select **Existing data source-managed rules** to import rules from connected Mimir or Loki data sources with the ruler API enabled.
- Select **Prometheus YAML file** to import rules by uploading a Prometheus YAML rule file.
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 13709c0545d..df7abac34b0 100644
--- a/docs/sources/alerting/alerting-rules/create-grafana-managed-rule.md
+++ b/docs/sources/alerting/alerting-rules/create-grafana-managed-rule.md
@@ -276,7 +276,6 @@ To do this, you need to make sure that your alert rule is in the right evaluatio
This is different to [mute timings](ref:mute-timings), which stop notifications from being delivered, but still allows for alert rule evaluation and the creation of alert instances.
1. In **Configure no data and error handling**, you can define the alerting behavior and alerting state for two scenarios:
-
- When the evaluation returns **No data** or all values are null.
- When the evaluation returns **Error** or timeout.
@@ -297,7 +296,6 @@ Complete the following steps to set up notifications.
1. Configure who receives a notification when an alert rule fires by either choosing **Select contact point** or **Use notification policy**.
**Select contact point**
-
1. Choose this option to select an existing [contact point](ref:contact-points).
All notifications for this alert rule are sent to this contact point automatically and notification policies aren't used.
@@ -305,7 +303,6 @@ Complete the following steps to set up notifications.
1. You can also optionally select a mute or active timing as well as groupings and timings to define when not to send notifications.
**Use notification policy**
-
1. Choose this option to use the [notification policy tree](ref:notification-policies) to handle alert notifications.
All notifications for this alert rule are managed by the notification policy tree, which routes alerts based on their labels.
diff --git a/docs/sources/alerting/alerting-rules/create-recording-rules/create-data-source-managed-recording-rules.md b/docs/sources/alerting/alerting-rules/create-recording-rules/create-data-source-managed-recording-rules.md
index 375268e520c..ba16e57c14a 100644
--- a/docs/sources/alerting/alerting-rules/create-recording-rules/create-data-source-managed-recording-rules.md
+++ b/docs/sources/alerting/alerting-rules/create-recording-rules/create-data-source-managed-recording-rules.md
@@ -38,7 +38,6 @@ Note that in data source-managed groups, the alert rules and recording rules wit
- Verify that you have write permission to the Prometheus or Loki data source. Otherwise, you will not be able to create or update Grafana Mimir managed alerting rules.
- For Grafana Mimir and Loki data sources, enable the ruler API by configuring their respective services.
-
- **Loki** - The `local` rule storage type, default for the Loki data source, supports only viewing of rules. To edit rules, configure one of the other rule storage types.
- **Mimir** - use the `/prometheus` prefix. The Prometheus data source supports both Grafana Mimir and Prometheus, and Grafana expects that both the [Query API](/docs/mimir/latest/operators-guide/reference-http-api/#querier--query-frontend) and [Ruler API](/docs/mimir/latest/operators-guide/reference-http-api/#ruler) are under the same URL. You cannot provide a separate URL for the Ruler API.
diff --git a/docs/sources/alerting/best-practices/_index.md b/docs/sources/alerting/best-practices/_index.md
index 892bfdfb186..18bcf13121a 100644
--- a/docs/sources/alerting/best-practices/_index.md
+++ b/docs/sources/alerting/best-practices/_index.md
@@ -8,7 +8,7 @@ labels:
- cloud
- enterprise
- oss
-menuTitle: Best Practices
+menuTitle: Best practices
title: Grafana Alerting best practices
weight: 170
---
diff --git a/docs/sources/alerting/best-practices/dynamic-labels.md b/docs/sources/alerting/best-practices/dynamic-labels.md
index 155b496d00a..7a9586ea6d9 100644
--- a/docs/sources/alerting/best-practices/dynamic-labels.md
+++ b/docs/sources/alerting/best-practices/dynamic-labels.md
@@ -233,7 +233,6 @@ This setup reproduces label flapping and shows how dynamic label values affect a
1. Simulate a query (`$A`) that returns a noisy signal.
Select **TestData** as the data source and configure the scenario.
-
- Scenario: Random Walk
- Series count: 1
- Start value: 51
@@ -241,7 +240,6 @@ This setup reproduces label flapping and shows how dynamic label values affect a
- Spread: 100 (ensures large changes between consecutive data points)
1. Add an expression.
-
- Type: Reduce
- Input: A
- Function: Last (to get the most recent value)
diff --git a/docs/sources/alerting/best-practices/dynamic-thresholds.md b/docs/sources/alerting/best-practices/dynamic-thresholds.md
index 56371657d7b..8cbc3ada2b0 100644
--- a/docs/sources/alerting/best-practices/dynamic-thresholds.md
+++ b/docs/sources/alerting/best-practices/dynamic-thresholds.md
@@ -146,7 +146,6 @@ You can use the [TestData data source](ref:testdata-data-source) to replicate th
1. Simulate a query (`$A`) that returns latencies for each service.
Select **TestData** as the data source and configure the scenario.
-
- Scenario: Random Walk
- Alias: latency
- Labels: service=api-$seriesIndex
@@ -179,7 +178,6 @@ You can use the [TestData data source](ref:testdata-data-source) to replicate th
For details on CSV format requirements, see [table data examples](ref:table-data-example).
1. Add a new **Reduce** expression (`$C`).
-
- Type: Reduce
- Input: A
- Function: Mean
@@ -188,7 +186,6 @@ You can use the [TestData data source](ref:testdata-data-source) to replicate th
This calculates the average latency for each service: `api-0`, `api-1`, etc.
1. Add a new **Math** expression.
-
- Type: Math
- Expression: `$C > $B`
- Set this expression as the **alert condition**.
diff --git a/docs/sources/alerting/best-practices/multi-dimensional-alerts.md b/docs/sources/alerting/best-practices/multi-dimensional-alerts.md
index 4523140248c..f612df6aa37 100644
--- a/docs/sources/alerting/best-practices/multi-dimensional-alerts.md
+++ b/docs/sources/alerting/best-practices/multi-dimensional-alerts.md
@@ -116,7 +116,6 @@ You can quickly experiment with multi-dimensional alerts using the [**TestData**
1. Go to **Alerting** and create an alert rule
1. Select **TestData** as the data source.
1. Configure the TestData scenario
-
- Scenario: **Random Walk**
- Labels: `cpu=cpu-$seriesIndex`
- Series count: 3
diff --git a/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-amazon-sns.md b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-amazon-sns.md
index e36a87f08fe..09ac3ee6bee 100644
--- a/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-amazon-sns.md
+++ b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-amazon-sns.md
@@ -89,11 +89,9 @@ This section outlines a minimal setup to configure Amazon SNS with Alerting.
### 1. Create an SNS Topic and Email Subscriber
1. **Navigate to SNS in AWS Console**:
-
- Go to the [Amazon SNS Console](https://console.aws.amazon.com/sns/v3/home).
2. **Create a new topic**:
-
- On the **Topics** page, choose **"Create topic"**.
- Select **"Standard"** as the type.
- Enter a **Name** for your topic, e.g., `My-Topic`.
@@ -110,11 +108,9 @@ This section outlines a minimal setup to configure Amazon SNS with Alerting.
### 2. Create an IAM Policy, User, and Access Key
1. **Navigate to IAM in AWS Console**:
-
- Go to the [IAM Console](https://console.aws.amazon.com/iam/home).
2. **Create a new policy**:
-
- On the **Policies** page, choose **"Create policy"**.
- Switch to the **"JSON"** tab and paste the following policy, replacing `Resource` with your SNS topic ARN:
@@ -134,7 +130,6 @@ This section outlines a minimal setup to configure Amazon SNS with Alerting.
- Click **"Next"**, name it (e.g., `SNSPublishPolicy`), and click **"Create policy"**.
3. **Create a new IAM user and assign the policy**
-
- In the IAM Console, on the **Users** page, choose **"Create user"**.
- Enter a **User name**, e.g., `alerting-sns-user`.
- Click **"Next"**.
diff --git a/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-email.md b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-email.md
index 02db8cf0172..b7226283d1b 100644
--- a/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-email.md
+++ b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-email.md
@@ -53,7 +53,6 @@ For Grafana OSS, you enable email notifications by first configuring [SMTP setti
1. Configure SMTP settings.
Within the `[smtp]` settings section, specify the following parameters:
-
- `enabled = true`: Enables SMTP.
- `host`: The hostname or IP address of your SMTP server, and the port number of your SMTP server (commonly 25, 465, or 587). Default is `localhost:25`.
- `user`: Your SMTP username (if authentication is required).
diff --git a/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-irm.md b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-irm.md
index 510d4e9a4f2..6c18f9064c9 100644
--- a/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-irm.md
+++ b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-irm.md
@@ -94,7 +94,6 @@ To create the integration, follow the same steps as described in [Configure an O
1. Navigate to **Alerts & IRM** -> **IRM** -> **Integrations**.
1. Click **+ New integration**.
1. Select either **Alertmanager** or **Webhook** integration from the list.
-
- **Alertmanager** integration – Includes preconfigured IRM templates for processing Grafana and Prometheus alerts.
- **Webhook** integration – Uses default IRM templates for general alert processing.
diff --git a/docs/sources/alerting/configure-notifications/template-notifications/examples.md b/docs/sources/alerting/configure-notifications/template-notifications/examples.md
index 23b69a9ce21..7927d367c94 100644
--- a/docs/sources/alerting/configure-notifications/template-notifications/examples.md
+++ b/docs/sources/alerting/configure-notifications/template-notifications/examples.md
@@ -444,7 +444,6 @@ Use one of the following methods to include a dashboard link with the correct ti
```
These URLs include a time range based on the alert’s timing:
-
- `from`: One hour before the alert started.
- `to`: The current time if the alert is firing, or the alert’s end time if resolved.
diff --git a/docs/sources/alerting/configure-notifications/template-notifications/manage-notification-templates.md b/docs/sources/alerting/configure-notifications/template-notifications/manage-notification-templates.md
index 3ebb73d6907..e449bb6ecff 100644
--- a/docs/sources/alerting/configure-notifications/template-notifications/manage-notification-templates.md
+++ b/docs/sources/alerting/configure-notifications/template-notifications/manage-notification-templates.md
@@ -57,7 +57,6 @@ To add an existing notification template to your contact point, complete the fol
1. Click **Edit**.
A dialog box opens where you can select notification templates.
1. Click **Select notification template** or **Enter custom message** to customize a template or message
-
- You can select an existing notification template and [preview](#preview-a-notification-template) it using the default payload.
- You can also copy the notification template and use it in the **Enter custom message** tab.
diff --git a/docs/sources/alerting/fundamentals/templates.md b/docs/sources/alerting/fundamentals/templates.md
index efed6ad7cac..62674000b45 100644
--- a/docs/sources/alerting/fundamentals/templates.md
+++ b/docs/sources/alerting/fundamentals/templates.md
@@ -55,12 +55,10 @@ Use templating to customize, format, and reuse alert notification messages. Crea
In Grafana, you have various options to template your alert notification messages:
1. [Alert rule annotations](#template-annotations)
-
- Annotations add extra information, like `summary` and `description`, to alert instances for notification messages.
- Template annotations to display query values that are meaningful to the alert, for example, the server name or the threshold query value.
1. [Alert rule labels](#template-labels)
-
- Labels are used to differentiate an alert instance from all other alert instances.
- Template labels to add an additional label based on a query value, or when the labels from the query are incomplete or not descriptive enough.
- Avoid displaying query values in labels as this can create numerous alert instances—use annotations instead.
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 23d5f06691f..90467ce5d6b 100644
--- a/docs/sources/alerting/set-up/provision-alerting-resources/_index.md
+++ b/docs/sources/alerting/set-up/provision-alerting-resources/_index.md
@@ -58,7 +58,6 @@ Choose from the options below to import (or provision) your Grafana Alerting res
1. [Use configuration files to provision your alerting resources](ref:alerting_file_provisioning), such as alert rules and contact points, through files on disk.
{{< admonition type="note" >}}
-
- You cannot edit provisioned resources from files in the Grafana UI.
- Provisioning with configuration files is not available in Grafana Cloud.
{{< /admonition >}}
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 2a5f5d97211..e595928e91a 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
@@ -159,7 +159,6 @@ In this section, we'll create Terraform configurations for each alerting resourc
```
Replace the following field values:
-
- `` with the terraform name of the data source.
- `` with the terraform name of the folder.
@@ -233,13 +232,11 @@ In this section, we'll create Terraform configurations for each alerting resourc
```
Replace the following field values:
-
- `` with the name of the alert rule group.
Note that the distinct Grafana resources are connected through `uid` values in their Terraform configurations. The `uid` value will be randomly generated when provisioning.
To link the alert rule group with its respective data source and folder in this example, replace the following field values:
-
- `` with the terraform name of the previously defined data source.
- `` with the terraform name of the previously defined folder.
@@ -266,7 +263,6 @@ In this section, we'll create Terraform configurations for each alerting resourc
```
Replace the following field values:
-
- `` with the terraform name of the contact point. It will be used to reference the contact point in other Terraform resources.
- `` with the email to receive alert notifications.
@@ -332,7 +328,6 @@ In this section, we'll create Terraform configurations for each alerting resourc
```
Replace the following field values:
-
- `` with the name of the Terraform resource. It will be used to reference the mute timing in the Terraform notification policy tree.
1. Continue to add more Grafana resources or [use the Terraform CLI for provisioning](#provision-grafana-resources-with-terraform).
@@ -363,7 +358,6 @@ In this section, we'll create Terraform configurations for each alerting resourc
```
To configure the mute timing and contact point previously created in the notification policy tree, replace the following field values:
-
- `` with the terraform name of the previously defined contact point.
- `` with the terraform name of the previously defined mute timing.
diff --git a/docs/sources/dashboards/build-dashboards/annotate-visualizations/index.md b/docs/sources/dashboards/build-dashboards/annotate-visualizations/index.md
index 7b7f90c097d..bd44477db06 100644
--- a/docs/sources/dashboards/build-dashboards/annotate-visualizations/index.md
+++ b/docs/sources/dashboards/build-dashboards/annotate-visualizations/index.md
@@ -140,7 +140,6 @@ To add a new annotation query to a dashboard, follow these steps:
1. If you don't want the annotation query toggle to be displayed in the dashboard, select the **Hidden** checkbox.
1. Select a color for the event markers.
1. In the **Show in** drop-down, choose one of the following options:
-
- **All panels** - The annotations are displayed on all panels that support annotations.
- **Selected panels** - The annotations are displayed on all the panels you select.
- **All panels except** - The annotations are displayed on all panels except the ones you select.
diff --git a/docs/sources/dashboards/build-dashboards/create-dashboard/index.md b/docs/sources/dashboards/build-dashboards/create-dashboard/index.md
index 033972b0b12..b62595986a2 100644
--- a/docs/sources/dashboards/build-dashboards/create-dashboard/index.md
+++ b/docs/sources/dashboards/build-dashboards/create-dashboard/index.md
@@ -101,7 +101,6 @@ Dashboards and panels allow you to show your data in visual form. Each panel nee
{{< /shared >}}
1. In the dialog box that opens, do one of the following:
-
- Select one of your existing data sources.
- Select one of the Grafana [built-in special data sources](ref:built-in-special-data-sources).
- Click **Configure a new data source** to set up a new one (Admins only).
@@ -127,7 +126,6 @@ Dashboards and panels allow you to show your data in visual form. Each panel nee
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.
-
- [Configure value mappings](ref:configure-value-mappings)
- [Visualization-specific options](ref:visualization-specific-options)
- [Override field values](ref:override-field-values)
diff --git a/docs/sources/dashboards/build-dashboards/create-dynamic-dashboard/index.md b/docs/sources/dashboards/build-dashboards/create-dynamic-dashboard/index.md
index 65a72a97d16..638ed32d79e 100644
--- a/docs/sources/dashboards/build-dashboards/create-dynamic-dashboard/index.md
+++ b/docs/sources/dashboards/build-dashboards/create-dynamic-dashboard/index.md
@@ -105,13 +105,11 @@ To create a dashboard, follow these steps:
{{< figure src="/media/docs/grafana/dashboards/screenshot-new-dashboard-v12.png" max-width="750px" alt="New dashboard" >}}
1. Under **Panel layout**, choose one of the following options:
-
- **Custom** - Position and size panels manually. The default selection.
- **Auto grid** - Panels are automatically resized to create a uniform grid based on the column and row settings.
1. Click **+ Add visualization**.
1. In the dialog box that opens, do one of the following:
-
- Select one of your existing data sources.
- Select one of the Grafana [built-in special data sources](ref:built-in-special-data-sources).
- Click **Configure a new data source** to set up a new one (Admins only).
@@ -137,7 +135,6 @@ To create a dashboard, follow these steps:
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.
-
- [Configure value mappings](ref:configure-value-mappings)
- [Visualization-specific options](ref:visualization-specific-options)
- [Override field values](ref:override-field-values)
@@ -227,9 +224,7 @@ To configure repeats, follow these steps:
1. Expand the **Repeat options** section.
1. Select the **Repeat by variable**.
1. For panels only, set the following options:
-
- Under **Repeat direction**, choose one of the following:
-
- **Horizontal** - Arrange panels side-by-side. Grafana adjusts the width of a repeated panel. You can’t mix other panels on a row with a repeated panel.
- **Vertical** - Arrange panels in a column. The width of repeated panels is the same as the original, repeated panel.
@@ -276,14 +271,12 @@ To configure show/hide rules, follow these steps:
1. Select **Show** or **Hide** to set whether the panel, row, or tab is shown or hidden based on the rules outcome.
1. Click **+ Add rule**.
1. Select a rule type:
-
- **Query result** - Show or hide a panel based on query results. Choose from **Has data** and **No data**. For panels only.
- **Template variable** - Show or hide the panel, row, or tab dynamically based on the variable value. Select a variable and operator and enter a value.
- **Time range less than** - Show or hide the panel, row, or tab if the dashboard time range is shorter than the selected time frame. Select or enter a time range.
1. Configure the rule.
1. Under **Match rules**, select one of the following:
-
- **Match all** - The panel, row, or tab is shown or hidden only if _all_ the rules are matched.
- **Match any** - The panel, row, or tab is shown or hidden if _any_ of the rules are matched.
@@ -315,7 +308,6 @@ To edit dashboards, follow these steps:
1. Click in the area you want to work with to bring it into focus and display the associated options in the edit pane.
1. Do one of the following:
-
- For rows or tabs, make the required changes using the edit pane.
- For panels, update the panel title, description, repeat options or show/hide rules in the edit pane. For more changes, click **Configure** and continue in **Edit panel** view.
- For dashboards, update the dashboard title, description, grouping or panel layout. For more changes, click the settings (gear) icon in the top-right corner.
@@ -355,7 +347,6 @@ To move or resize, follow these steps:
1. Navigate to the dashboard you want to update.
1. Toggle on the edit mode switch.
1. Do one of the following:
-
- Click the panel title and drag the panel to the new location.
- Click and drag the lower-right corner of the panel to change the size of the panel.
diff --git a/docs/sources/dashboards/build-dashboards/import-dashboards/index.md b/docs/sources/dashboards/build-dashboards/import-dashboards/index.md
index 6378fe4288a..df660d1b351 100644
--- a/docs/sources/dashboards/build-dashboards/import-dashboards/index.md
+++ b/docs/sources/dashboards/build-dashboards/import-dashboards/index.md
@@ -40,7 +40,6 @@ To import a dashboard, follow these steps:
1. Click **Dashboards** in the primary menu.
1. Click **New** and select **Import** in the drop-down menu.
1. Perform one of the following steps:
-
- Upload a dashboard JSON file.
- Paste a [Grafana.com dashboard](#discover-dashboards-on-grafanacom) URL or ID into the field provided.
- Paste dashboard JSON text directly into the text area.
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 3dd373f4c31..99f4cf3bf32 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,6 @@ Add links to other dashboards at the top of your current dashboard.
If you don't add any tags, Grafana includes links to all other dashboards.
1. Set link options:
-
- **Show as dropdown** – If you are linking to lots of dashboards, then you probably want to select this option and add an optional title to the dropdown. Otherwise, Grafana displays the dashboard links side by side across the top of your dashboard.
- **Include current time range** – Select this option to include the dashboard time range in the link. When the user clicks the link, the linked dashboard opens with the indicated time range already set. **Example:** https://play.grafana.org/d/000000010/annotations?orgId=1&from=now-3h&to=now
- **Include current template 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. For more information, see [Dashboard URL variables](ref:dashboard-url-variables).
@@ -118,7 +117,6 @@ Add a link to a URL at the top of your current dashboard. You can link to any av
1. In the **Tooltip** field, enter the tooltip you want the link to display when the user hovers their mouse over it.
1. In the **Icon** drop-down, choose the icon you want displayed with the link.
1. Set link options; by default, these options are enabled for URL links:
-
- **Include current time range** – Select this option to include the dashboard time range in the link. When the user clicks the link, the linked dashboard opens with the indicated time range already set. **Example:** https://play.grafana.org/d/000000010/annotations?orgId=1&from=now-3h&to=now
- **Include current template 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.
- **Open link in new tab** – Select this option if you want the dashboard link to open in a new tab or window.
@@ -134,7 +132,6 @@ To edit, duplicate, or delete dashboard link, follow these steps:
1. Click **Settings**.
1. Go to the **Links** tab.
1. Do one of the following:
-
- **Edit** - Click the name of the link and update the link settings.
- **Duplicate** - Click the copy link icon next to the link that you want to duplicate.
- **Delete** - Click the red **X** next to the link that you want to delete, and then **Delete**.
diff --git a/docs/sources/dashboards/build-dashboards/modify-dashboard-settings/index.md b/docs/sources/dashboards/build-dashboards/modify-dashboard-settings/index.md
index a58f0332e50..ea79a3686c6 100644
--- a/docs/sources/dashboards/build-dashboards/modify-dashboard-settings/index.md
+++ b/docs/sources/dashboards/build-dashboards/modify-dashboard-settings/index.md
@@ -58,7 +58,6 @@ Adjust dashboard time settings when you want to change the dashboard timezone, t
1. On the **Settings** page, scroll down to the **Time Options** section of the **General** tab.
1. Specify time settings as follows.
-
- **Time zone:** Specify the local time zone of the service or system that you are monitoring. This can be helpful when monitoring a system or service that operates across several time zones.
- **Default:** Grafana uses the default selected time zone for the user profile, team, or organization. If no time zone is specified for the user profile, a team the user is a member of, or the organization, then Grafana uses the local browser time.
- **Browser time:** The time zone configured for the viewing user browser is used. This is usually the same time zone as set on the computer.
diff --git a/docs/sources/dashboards/create-manage-playlists/index.md b/docs/sources/dashboards/create-manage-playlists/index.md
index 20dba1c7cc6..4f2d7831350 100644
--- a/docs/sources/dashboards/create-manage-playlists/index.md
+++ b/docs/sources/dashboards/create-manage-playlists/index.md
@@ -48,7 +48,6 @@ You can start a playlist in four different view modes. View modes determine how
1. Find the desired playlist and click **Start playlist**.
1. In the dialog box that opens, select one of the [four playlist modes](#playlist-modes) available.
1. Disable any dashboard controls that you don't want displayed while the list plays; these controls are enabled and visible by default. Select from:
-
- **Time and refresh**
- **Variables**
- **Dashboard links**
@@ -100,7 +99,6 @@ You can edit a playlist including adding, removing, and rearranging the order of
1. Click **Dashboards** in the main menu.
1. Click **Playlists**.
1. Find the playlist you want to update and click **Edit playlist**. Do one or more of the following:
-
- Edit - Update the name and time interval.
- Add dashboards - Search for dashboards by title or tag to add them to the playlist.
- Rearrange dashboards - Click and drag the dashboards into your desired order.
diff --git a/docs/sources/dashboards/create-reports/_index.md b/docs/sources/dashboards/create-reports/_index.md
index 645efcfbb95..0e9650f35ca 100644
--- a/docs/sources/dashboards/create-reports/_index.md
+++ b/docs/sources/dashboards/create-reports/_index.md
@@ -147,7 +147,6 @@ To create a report, follow these steps:
- [Recipients](#4-recipients)
- [Attachments](#5-attachments)
1. Click one of the following buttons at the bottom of the **Schedule report** drawer:
-
- The menu icon to access the following options:
- **Download CSV**
- **Preview PDF**
@@ -179,7 +178,6 @@ To create a report, follow these steps:
- [Recipients](#4-recipients)
- [Attachments](#5-attachments)
1. Click one of the following buttons at the bottom of the **Schedule report** drawer:
-
- The menu icon to access the following options:
- **Download CSV**
- **Preview PDF**
@@ -358,7 +356,6 @@ You can also navigate to the list of all reports from the dashboard-specific lis
To edit a report, follow these steps:
1. Do one of the following:
-
- In the main menu, click **Dashboards > Reporting**.
- Navigate to the dashboard from which the report was generated and click **Share > Schedule report**.
@@ -373,12 +370,10 @@ You can pause and resume sending reports from the report list view.
To do this, follow these steps:
1. Do one of the following:
-
- In the main menu, click **Dashboards > Reporting**.
- Navigate to the dashboard from which the report was generated and click **Share > Schedule report**.
1. On the row of the report you want to update, do one of the following:
-
- Click the pause icon - The report won't be sent according to its schedule until it's resumed.
- Click the resume icon - The report resumes on its previous schedule.
@@ -389,7 +384,6 @@ You can also pause or resume a report from **Update report** drawer.
To delete a report, follow these steps:
1. Do one of the following:
-
- In the main menu, click **Dashboards > Reporting**.
- Navigate to the dashboard from which the report was generated and click **Share > Schedule report**.
diff --git a/docs/sources/dashboards/manage-dashboards/index.md b/docs/sources/dashboards/manage-dashboards/index.md
index 67ec9e71044..e09f2837eaa 100644
--- a/docs/sources/dashboards/manage-dashboards/index.md
+++ b/docs/sources/dashboards/manage-dashboards/index.md
@@ -76,7 +76,6 @@ Folders help you organize and group dashboards, which is useful when you have ma
1. Click **Dashboards** in the primary menu.
1. Do one of the following:
-
- On the **Dashboards** page, click **New** and select **New folder** in the drop-down.
- Click an existing folder and on the folder’s page, click **New** and select **New folder** in the drop-down.
diff --git a/docs/sources/dashboards/share-dashboards-panels/_index.md b/docs/sources/dashboards/share-dashboards-panels/_index.md
index 00966e787e1..1b606ed8d0d 100644
--- a/docs/sources/dashboards/share-dashboards-panels/_index.md
+++ b/docs/sources/dashboards/share-dashboards-panels/_index.md
@@ -259,7 +259,6 @@ To share a personalized, direct link to your panel within your organization, fol
1. Click **Copy link**.
1. Send the copied link to a Grafana user with authorization to view it.
1. (Optional) To [generate an image of the panel as a PNG file](ref:image-rendering), customize the image settings:
-
- **Width** - In pixels. The default is 1000.
- **Height** - In pixels. The default is 500.
- **Scale factor** - The default is 1.
diff --git a/docs/sources/dashboards/use-dashboards/index.md b/docs/sources/dashboards/use-dashboards/index.md
index c5bba9e9e6d..5d956b4c380 100644
--- a/docs/sources/dashboards/use-dashboards/index.md
+++ b/docs/sources/dashboards/use-dashboards/index.md
@@ -304,7 +304,6 @@ To edit or delete filters, follow these steps:
1. On the dashboard, click anywhere on the filter you want to change.
1. Do one of the following:
-
- To edit the operator or value of a filter, click anywhere on the filter and update it.

diff --git a/docs/sources/dashboards/variables/_index.md b/docs/sources/dashboards/variables/_index.md
index 6ec5d4916ed..da7451271d2 100644
--- a/docs/sources/dashboards/variables/_index.md
+++ b/docs/sources/dashboards/variables/_index.md
@@ -15,57 +15,81 @@ weight: 800
# Variables
+A variable is a placeholder for a value.
+When you change the value, the element using the variable will change to reflect the new value.
+
+Variables are displayed as drop-down lists (or in some cases text fields) at the top of the dashboard.
+These drop-down lists make it easy to update the variable value and thus change the data being displayed in your dashboard.
+
+For example, if you needed to monitor several servers, you _could_ make a dashboard for each server.
+Or you could create one dashboard and use panels with variables like this one, where you can change the server using the variable selector:
+
+{{< figure src="/media/docs/grafana/dashboards/screenshot-selected-variables-v12.png" max-width="750px" alt="Variable drop-down open and two values selected" >}}
+
+Variables allow you to create more interactive dashboards.
+Instead of hard-coding things like server, application, and sensor names in your metric queries, you can use variables in their place.
+They're useful for administrators who want to allow Grafana viewers to adjust visualizations without giving them full editing permissions.
+
+Using variables also allows you to single-source dashboards.
+If you have multiple identical data sources or servers, you can make one dashboard and use variables to change what you are viewing.
+This simplifies maintenance and upkeep enormously.
+
{{< youtube id="mMUJ3iwIYwc" >}}
+You can use variables in:
+
+- Data source queries
+- [Panel repeating options](https://grafana.com/docs/grafana//panels-visualizations/configure-panel-options/#configure-repeating-panels)
+- [Dashboard and panel links](https://grafana.com/docs/grafana//dashboards/build-dashboards/manage-dashboard-links/)
+- Titles
+- Descriptions
+- [Transformations](https://grafana.com/docs/grafana//panels-visualizations/query-transform-data/transform-data/)
+
+To see variable settings, navigate to **Dashboard Settings > Variables**.
+Click a variable in the list to see its settings.
+
+{{< docs/play title="Templating - Interactive dashboard" url="https://play.grafana.org/goto/B9Xog68Hg?orgId=1" >}}
+
+## Template variables {#templates}
+
+A _template_ is any query that contains a variable.
+Queries with text that starts with `$` are templates.
+
+{{< admonition type="note">}}
+In our documentation and in the application, we typically simply refer to a _template query_ as a _query_, but we often use the terms _variable_ and _template variable_ interchangeably.
+{{< /admonition >}}
+
+For example, if you were administering a dashboard to monitor several servers, it could have panels that use template queries like this one:
+
+```text
+groupByNode(movingAverage(apps.$app.$server.counters.requests.count, 10), 2, 'sum')
+```
+
+The following image shows a panel in edit mode using the query:
+
+{{< figure src="/media/docs/grafana/dashboards/screenshot-template-query-v12.1.png" max-width="750px" alt="A panel using a template query" >}}
+
+### Variables in URLs
+
+Variable values are always synced to the URL using [query parameter syntax](https://grafana.com/docs/grafana/latest/dashboards/variables/variable-syntax/#query-parameters), `var-=value`.
+For example:
+
+```text
+https://play.grafana.org/d/HYaGDGIMk/templating-global-variables-and-interpolation?orgId=1&from=now-6h&to=now&timezone=utc&var-Server=CCC&var-MyCustomDashboardVariable=Hello%20World%21
+```
+
+In the preceding example, the variables and values are `var-Server=CCC` and `var-MyCustomDashboardVariable=Hello%20World%21`.
+
+## Additional examples
+
+The following dashboards in Grafana Play provide examples of template variables:
+
+- [Templating - Repeated panels](https://play.grafana.org/goto/yfZOReUNR?orgId=1) - Using query variables to control how many panels appear in a dashboard.
+- [Templating - Nested Variables Drilldown](https://play.grafana.org/d/testdata-nested-variables-drilldown/) - Demonstrates how changing one variable value can change the values available in a nested variable.
+- [Templating - Global variables and interpolation](https://play.grafana.org/d/HYaGDGIMk/) - Shows you how the syntax for Grafana variables works.
+
+## Next steps
+
The following topics describe how to add and manage variables in your dashboards:
{{< section >}}
-
-A variable is a placeholder for a value. You can use variables in metric queries and in panel titles. So when you change
-the value, using the dropdown at the top of the dashboard, your panel's metric queries will change to reflect the new value.
-
-Variables allow you to create more interactive and dynamic dashboards. Instead of hard-coding things like server, application,
-and sensor names in your metric queries, you can use variables in their place. Variables are displayed as dropdown lists at the top of
-the dashboard. These dropdowns make it easy to change the data being displayed in your dashboard.
-
-{{< figure src="/static/img/docs/v50/variables_dashboard.png" alt="Variable drop-down open and two values selected" >}}
-
-{{< docs/play title="Templating - Global variables and interpolation" url="https://play.grafana.org/d/HYaGDGIMk/" >}}
-
-Variables are useful for administrators who want to allow Grafana viewers to adjust visualizations without giving them full editing permissions. Grafana viewers can use variables.
-
-Variables and templates also allow you to single-source dashboards. If you have multiple identical data sources or servers, you can make one dashboard and use variables to change what you are viewing. This simplifies maintenance and upkeep enormously.
-
-## Templates
-
-A _template_ is any query that contains a variable.
-
-For example, if you were administering a dashboard to monitor several servers, you _could_ make a dashboard for each server. Or you could create one dashboard and use panels with template queries like this one:
-
-```
-wmi_system_threads{instance=~"$server"}
-```
-
-Variable values are always synced to the URL using the syntax `var-=value`.
-
-## Additional Examples
-
-Variables are listed in drop-down lists across the top of the screen. Select different variables to see how the visualizations change.
-
-To see variable settings, navigate to **Dashboard Settings > Variables**. Click a variable in the list to see its settings.
-
-Variables can be used in titles, descriptions, text panels, and queries. Queries with text that starts with `$` are templates. Not all panels will have template queries.
-
-The following dashboards in Grafana Play provide examples of template variables:
-
-- [Templating, repeated panels](https://play.grafana.org/d/000000025/) - Using query variables to control how many panels appear.
-- [Templated Dynamic Dashboard](https://play.grafana.org/d/000000056/) - Uses query variables, chained query variables, an interval variable, and a repeated panel.
-- [Templating - Nested Variables Drilldown](https://play.grafana.org/d/testdata-nested-variables-drilldown/)
-
-## Variable best practices
-
-- Variable drop-down lists are displayed in the order they are listed in the variable list in Dashboard settings.
-- Put the variables that you will change often at the top, so they will be shown first (far left on the dashboard).
-- By default, variables don't have a default value. This means that the topmost value in the drop-down is always preselected. If you want to pre-populate a variable with an empty value, you can use the following workaround in the variable settings:
- 1. Select the **Include All Option** checkbox.
- 2. In the **Custom all value** field, enter a value like `+`.
diff --git a/docs/sources/dashboards/variables/add-template-variables/index.md b/docs/sources/dashboards/variables/add-template-variables/index.md
index 54dc20e2d47..38b2bbc27e1 100644
--- a/docs/sources/dashboards/variables/add-template-variables/index.md
+++ b/docs/sources/dashboards/variables/add-template-variables/index.md
@@ -35,6 +35,7 @@ keywords:
- nested
- chained
- linked
+ - best practices
labels:
products:
- cloud
@@ -121,13 +122,11 @@ To create a variable, follow these steps:
If you don't enter a display name, then the drop-down list label is the variable name.
1. Choose a **Show on dashboard** option:
-
- **Label and value** - The variable drop-down list displays the variable **Name** or **Label** value. This is the default.
- **Value:** The variable drop-down list only displays the selected variable value and a down arrow.
- **Nothing:** No variable drop-down list is displayed on the dashboard.
1. Click one of the following links to complete the steps for adding your selected variable type:
-
- [Query](#add-a-query-variable)
- [Custom](#add-a-custom-variable)
- [Textbox](#add-a-text-box-variable)
@@ -138,6 +137,13 @@ To create a variable, follow these steps:
+### Variable best practices
+
+- Variable drop-down lists are displayed in the order in which they're listed in the **Variables** in dashboard settings, so put the variables that you will change often at the top, so they will be shown first (far left on the dashboard).
+- By default, variables don't have a default value. This means that the topmost value in the drop-down list is always preselected. If you want to pre-populate a variable with an empty value, you can use the following workaround in the variable settings:
+ 1. Select the **Include All Option** checkbox.
+ 2. In the **Custom all value** field, enter a value like `+`.
+
## Add a query variable
Query variables enable you to write a data source query that can return a list of metric names, tag values, or keys. For example, a query variable might return a list of server names, sensor IDs, or data centers. The variable values change as they dynamically fetch options with a data source query.
@@ -157,7 +163,6 @@ Query expressions are different for each data source. For more information, refe
For more information about data sources, refer to [Add a data source](ref:add-a-data-source).
1. In the **Query type** drop-down list, select one of the following options:
-
- **Label names**
- **Label values**
- **Metrics**
@@ -166,7 +171,6 @@ Query expressions are different for each data source. For more information, refe
- **Classic query**
1. In the **Query** field, enter a query.
-
- The query field varies according to your data source. Some data sources have custom query editors.
- Each data source defines how the variable values are extracted. The typical implementation uses every string value returned from the data source response as a variable value. Make sure to double-check the documentation for the data source.
- Some data sources let you provide custom "display names" for the values. For instance, the PostgreSQL, MySQL, and Microsoft SQL Server plugins handle this by looking for fields named `__text` and `__value` in the result. Other data sources may look for `text` and `value` or use a different approach. Always remember to double-check the documentation for the data source.
@@ -175,12 +179,10 @@ Query expressions are different for each data source. For more information, refe
1. (Optional) In the **Regex** field, type a regular expression to filter or capture specific parts of the names returned by your data source query. To see examples, refer to [Filter variables with a regular expression](#filter-variables-with-regex).
1. In the **Sort** drop-down list, select the sort order for values to be displayed in the dropdown list. The default option, **Disabled**, means that the order of options returned by your data source query is used.
1. Under **Refresh**, select when the variable should update options:
-
- **On dashboard load** - Queries the data source every time the dashboard loads. This slows down dashboard loading, because the variable query needs to be completed before dashboard can be initialized.
- **On time range change** - Queries the data source every time the dashboard loads and when the dashboard time range changes. Use this option if your variable options query contains a time range filter or is dependent on the dashboard time range.
1. (Optional) Configure the settings in the [Selection Options](#configure-variable-selection-options) section:
-
- **Multi-value** - Enables multiple values to be selected at the same time.
- **Include All option** - Enables an option to include all variables.
@@ -200,7 +202,6 @@ For example, if you have server names or region names that never change, then yo
You can include numbers, strings, or key/value pairs separated by a space and a colon. For example, `key1 : value1,key2 : value2`.
1. (Optional) Configure the settings in the [Selection Options](#configure-variable-selection-options) section:
-
- **Multi-value** - Enables multiple values to be selected at the same time.
- **Include All option** - Enables an option to include all variables.
@@ -249,7 +250,6 @@ _Data source_ variables enable you to quickly change the data source for an enti
Leave this field empty to display all instances.
1. (Optional) Configure the settings in the [Selection Options](#configure-variable-selection-options) section:
-
- **Multi-value** - Enables multiple values to be selected at the same time.
- **Include All option** - Enables an option to include all variables.
@@ -271,7 +271,6 @@ You can use an interval variable as a parameter to group by time (for InfluxDB),
1. (Optional) Select on the **Auto option** checkbox if you want to add the `auto` option to the list.
This option allows you to specify how many times the current time range should be divided to calculate the current `auto` time span. If you turn it on, then two more options appear:
-
- **Step count** - Select the number of times the current time range is divided to calculate the value, similar to the **Max data points** query option. For example, if the current visible time range is 30 minutes, then the `auto` interval groups the data into 30 one-minute increments. The default value is 30 steps.
- **Min interval** - The minimum threshold below which the step count intervals does not divide the time. To continue the 30 minute example, if the minimum interval is set to 2m, then Grafana would group the data into 15 two-minute increments.
diff --git a/docs/sources/datasources/elasticsearch/configure-elasticsearch-data-source.md b/docs/sources/datasources/elasticsearch/configure-elasticsearch-data-source.md
index 6880eae661c..feb170a5c16 100644
--- a/docs/sources/datasources/elasticsearch/configure-elasticsearch-data-source.md
+++ b/docs/sources/datasources/elasticsearch/configure-elasticsearch-data-source.md
@@ -130,7 +130,6 @@ The following settings are specific to the Elasticsearch data source.
- **Index name** - Use the index settings to specify a default for the `time field` and your Elasticsearch index's name. You can use a time pattern, for example `[logstash-]YYYY.MM.DD`, or a wildcard for the index name. When specifying a time pattern, the fixed part(s) of the pattern should be wrapped in square brackets.
- **Pattern** - Select the matching pattern if using one in your index name. Options include:
-
- no pattern
- hourly
- daily
diff --git a/docs/sources/datasources/elasticsearch/query-editor/index.md b/docs/sources/datasources/elasticsearch/query-editor/index.md
index c6e56ed963d..fa20353a395 100644
--- a/docs/sources/datasources/elasticsearch/query-editor/index.md
+++ b/docs/sources/datasources/elasticsearch/query-editor/index.md
@@ -61,7 +61,6 @@ Metrics queries aggregate data and produce a variety of calculations such as cou
- **Alias** - Aliasing only applies to **time series queries**, where the last group is `date histogram`. This is ignored for any other type of query.
- **Metric** - Metrics aggregations include:
-
- count - see [Value count aggregation](https://www.elastic.co/guide/en/elasticsearch/reference/8.9/search-aggregations-metrics-valuecount-aggregation.html)
- average - see [Avg aggregation](https://www.elastic.co/guide/en/elasticsearch/reference/8.9/search-aggregations-metrics-rate-aggregation.html)
- sum - see [Sum aggregation](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-metrics-sum-aggregation.html)
@@ -78,7 +77,6 @@ You can select multiple metrics and group by multiple terms or filters when usin
Use the **+ sign** to the right to add multiple metrics to your query. Click on the **eye icon** next to **Metric** to hide metrics, and the **garbage can icon** to remove metrics.
- **Group by options** - Create multiple group by options when constructing your Elasticsearch query. Date histogram is the default option. Below is a list of options in the dropdown menu.
-
- terms - see [Terms aggregation](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html).
- filter - see [Filter aggregation](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-filter-aggregation.html).
- geo hash grid - see [Geohash grid aggregation](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-geohashgrid-aggregation.html).
diff --git a/docs/sources/datasources/google-cloud-monitoring/_index.md b/docs/sources/datasources/google-cloud-monitoring/_index.md
index 61b37b747fd..27bc7b390cd 100644
--- a/docs/sources/datasources/google-cloud-monitoring/_index.md
+++ b/docs/sources/datasources/google-cloud-monitoring/_index.md
@@ -83,7 +83,6 @@ If Grafana is running on a Google Compute Engine (GCE) virtual machine, when you
Before you can request data from Google Cloud Monitoring, you must first enable necessary APIs on the Google end.
1. Open the Monitoring and Cloud Resource Manager API pages:
-
- [Monitoring API](https://console.cloud.google.com/apis/library/monitoring.googleapis.com)
- [Cloud Resource Manager API](https://console.cloud.google.com/apis/library/cloudresourcemanager.googleapis.com)
diff --git a/docs/sources/datasources/influxdb/configure-influxdb-data-source/_index.md b/docs/sources/datasources/influxdb/configure-influxdb-data-source/_index.md
index d50db2e9d43..0c958283f0e 100644
--- a/docs/sources/datasources/influxdb/configure-influxdb-data-source/_index.md
+++ b/docs/sources/datasources/influxdb/configure-influxdb-data-source/_index.md
@@ -34,15 +34,11 @@ This document provides instructions for configuring the InfluxDB data source and
To configure the InfluxDB data source you must have the `Administrator` role.
-{{< admonition type="note" >}}
-Select the query language you want to use with InfluxDB before adding the InfluxDB data source. Configuration options differ based on query language type.
-{{< /admonition >}}
-
InfluxData provides three query languages. Some key points to consider:
-- SQL is only available for InfluxDB v3.x.
- Flux is a functional data scripting language for InfluxDB 2.x. Refer to [Query InfluxDB with Flux](https://docs.influxdata.com/influxdb/cloud/query-data/get-started/query-influxdb/) for a basic guide on working with Flux.
- InfluxQL is SQL-like query language developed by InfluxData. It doesn't support more advanced functions such as JOINs.
+- SQL is only available for InfluxDB v3.x.
To help choose the best language for your needs, refer to
a [comparison of Flux vs InfluxQL](https://docs.influxdata.com/influxdb/v1.8/flux/flux-vs-influxql/)
@@ -60,97 +56,123 @@ Complete the following steps to set up a new InfluxDB data source:
You are taken to the **Settings** tab where you will configure the data source.
-## InfluxDB common configuration options
+## Configuration Options
-The following configuration options apply to **all three query language options**.
+The following is a list of configuration options for InfluxDB.
+
+
+
+The first option is to configure the name of your connection.
- **Name** - Sets the name you use to refer to the data source in panels and queries. Examples: `InfluxDB-InfluxQL`, `InfluxDB_SQL`.
- **Default** - Toggle to set as the default data source.
-- **Query language** - Select the query language for your InfluxDB instance. The three options are:
- - **InfluxQL** - SQL-like language for querying InfluxDB, with statements such as SELECT, FROM, WHERE, and GROUP BY that are familiar to SQL users.
- - **SQL** - Native SQL language starting with InfluxDB v.3.0. Refer to InfluxData's [SQL reference documentation](https://docs.influxdata.com/influxdb/cloud-serverless/reference/sql/) for a list of supported statements, operators, and functions.
- - **Flux** - Flux is a data scripting language developed by InfluxData that allows you to query, analyze, and act on data. Refer to [Get started with Flux](https://docs.influxdata.com/influxdb/cloud/query-data/get-started/) for guidance on using Flux.
-**HTTP section:**
+### URL and Authentication
+
+
+
+These settings identify the Influx instance and schema the data source is connecting to.
- **URL** - The HTTP protocol, IP address, and port of your InfluxDB API. InfluxDB’s default API port is `8086`.
+- **Product** - Select the product version of your Influx instance.
+- **Query language** - Select the query language for your InfluxDB instance. This will determine the connection details needed in **Database Settings**. The three options are:
+ - **Flux** - Flux is a data scripting language developed by InfluxData that allows you to query, analyze, and act on data. Refer to [Get started with Flux](https://docs.influxdata.com/influxdb/cloud/query-data/get-started/) for guidance on using Flux.
+ - **InfluxQL** - SQL-like language for querying InfluxDB, with statements such as SELECT, FROM, WHERE, and GROUP BY that are familiar to SQL users.
+ - **SQL** - Native SQL language starting with **InfluxDB v.3.0**. Refer to InfluxData's [SQL reference documentation](https://docs.influxdata.com/influxdb/cloud-serverless/reference/sql/) for a list of supported statements, operators, and functions.
+
+{{< admonition type="note" >}}
+_For InfluxQL only._ **Database + Retention Policy (DBRP) Mapping** must be configured before data can be queried for the following product versions: _Influx OSS 1.x_, _Influx OSS 2.x_, _Influx Enterprise 1.x_, _Influx Cloud (TSM)_, _Influx Cloud Serverless_
+
+Refer to [Manage DBRP Mappings](https://docs.influxdata.com/influxdb/cloud/query-data/influxql/dbrp/) for guidance on setting this up via the CLI or API
+{{< /admonition >}}
+
+#### Advanced HTTP Settings (Optional)
+
+Advanced HTTP Settings are optional settings that can be configured for more control over your data source.
+
- **Allowed cookies** - Defines which cookies are forwarded to the data source. All other cookies are deleted by default.
- **Timeout** - Set an HTTP request timeout in seconds.
-**Auth section:**
+**Custom HTTP Headers**
-- **Basic auth** - The most common authentication method. Use your InfluxData user name and password to authenticate. Toggling requires you to add the user and password under **Basic auth details**.
-- **With credentials** - Toggle to enable credentials such as cookies or auth headers to be sent with cross-site requests.
-- **TLS client auth** - Toggle to use client authentication. When enabled, add the `Server name`, `Client cert` and `Client key` under the **TLS/SSL auth details** section. The client provides a certificate that the server validates to establish the client’s trusted identity. The client key encrypts the data between client and server.
-- **With CA cert** - Authenticate with a CA certificate. Follow the instructions of your CA (Certificate Authority) to download the certificate file.
-- **Skip TLS verify** - Toggle to bypass TLS certificate validation.
-- **Forward OAuth identity** - Forward the OAuth access token (and also the OIDC ID token if available) of the user querying the data source.
-
-**Basic auth details:**
-
-If you enable **Basic auth** under the Auth section you need to configure the following:
-
-- **User** - Add the username used to sign in to InfluxDB.
-- **Password** - Defines the token you use to query the bucket defined in **Database**. Retrieve this from the [Tokens page](https://docs.influxdata.com/influxdb/v2.0/security/tokens/view-tokens/) in the InfluxDB UI.
-
-**TLS/SSL auth details:**
-
-TLS/SSL certificates are encrypted and stored in the Grafana database.
-
-- **CA cert** - If you toggle **With CA cert** add your self-signed cert here.
-- **Server name** - Name of the server. Example: server1.domain.com
-- **Client cert** - Add the client certificate.
-- **Client key** - Add the client key.
-
-**Custom HTTP headers:**
+Click **+ Add header** to add one or more HTTP headers. HTTP headers pass additional context and metadata about the request/response.
- **Header** - Add a custom HTTP header. Select an option from the drop-down. Allows custom headers to be passed based on the needs of your InfluxDB instance.
- **Value** - The value for the header.
-**Private data source connect:**
+#### Auth and TSL/SSL Settings (Optional)
-- **Private data source connect** - _Only for Grafana Cloud users._ Private data source connect, or PDC, allows you to establish a private, secured connection between a Grafana Cloud instance, or stack, and data sources secured within a private network. Click the drop-down to locate the URL for PDC. For more information regarding Grafana PDC refer to [Private data source connect (PDC)](https://grafana.com/docs/grafana-cloud/connect-externally-hosted/private-data-source-connect/).
+There are several authentication methods you can choose in the Authentication section.
+
+- **No Authentication** - Make the data source available without authentication. Grafana recommends using some type of authentication method.
+- **Basic auth** - The most common authentication method. Use your Influx instance username and password to authenticate.
+- **Forward OAuth identity** - Forward the OAuth access token (and also the OIDC ID token if available) of the user querying the data source.
+- **With credentials** - Toggle to enable credentials such as cookies or auth headers to be sent with cross-site requests.
+
+TLS/SSL Certificates are encrypted and stored in the Grafana database.
+
+- **TLS client auth** - When enabled, add the `Server name`, `Client cert` and `Client key`. The client provides a certificate that the server validates to establish the client’s trusted identity. The client key encrypts the data between client and server.
+ - **Server name** - Name of the server. Example: `server1.domain.com`
+ - **Client cert** - Add the client certificate.
+ - **Client key** - Add the client key.
+- **CA cert** - Authenticate with a CA certificate. When enabled, follow the instructions of your CA (Certificate Authority) to download the certificate file.
+- **Skip TLS verify** - Toggle to bypass TLS certificate validation.
+
+### Database Settings
+
+
+
+{{< admonition type="note" >}}
+Setting the database for this data source **does not deny access to other databases**. The InfluxDB query syntax allows switching the database in the query. For example: `SHOW MEASUREMENTS ON _internal` or `SELECT * FROM "_internal".."database" LIMIT 10`
+
+To support data isolation and security, make sure appropriate permissions are configured in InfluxDB.
+{{< /admonition >}}
+
+These settings identify the Influx database your data source will connect to. The required information will vary by the query language selected in **URL and Authentication**. Each query language uses a different set of connection details.
+
+The table below illustrates the details needed for each query language:
+
+| **Setting** | **Flux** | **InfluxQL** | **SQL** |
+| -------------------------- | -------- | ------------ | -------- |
+| **Bucket** or **Database** | ✓ | ✓ | ✓ |
+| **Organization** | ✓ | | |
+| **Password** or **Token** | ✓ | ✓ | ✓ |
+| **User** | | ✓ | |
+
+- **Bucket** or **Database** - Sets the ID of the bucket to query. Refer to [View buckets](https://docs.influxdata.com/influxdb/v2.0/organizations/buckets/view-buckets/) in InfluxData's documentation on how to locate the list of available buckets and their corresponding IDs.
+- **Organization** - Sets the [Influx organization](https://v2.docs.influxdata.com/v2.0/organizations/) used for Flux queries. Also used for the `v.organization` query macro.
+- **Password** or **Token** - Specify the token used to query the bucket defined in **Database**. Retrieve this from the [Tokens page](https://docs.influxdata.com/influxdb/v2.0/security/tokens/view-tokens/) in the InfluxDB UI.
+- **User** - Add the username used to sign in to InfluxDB.
+
+**For Flux**
+
+- **Default bucket** is optional. The [Influx bucket](https://v2.docs.influxdata.com/v2.0/organizations/buckets/) used for the `v.defaultBucket` macro in Flux queries.
+- With Influx 2.0 products, 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`.
+
+#### Advanced Database Settings (Optional)
+
+Advanced Database Settings are optional settings that give you more control over the query experience.
+
+- **Min time interval** - Sets the minimum time interval for auto group-by. Grafana recommends setting this to match the data write frequency. For example, if your data is written every minute, it’s recommended to set this interval to 1 minute, so that each group contains data from each new write. The default is `10s`. Refer to [Min time interval](#min-time-interval) for format examples.
+- **Max series** - Sets a limit on the maximum number of series or tables that Grafana processes. Set a lower limit to prevent system overload, or increase it if you have many small time series and need to display more of them. The default is `1000`.
+
+**For InfluxQL**
+
+- **HTTP method** - Sets the HTTP method used to query your data source. The POST method allows for larger queries that would return an error using the GET method. The default method is `POST`.
+- **Autocomplete range** - Sets a time range limit for the query editor's autocomplete to reduce the execution time of tag filter queries. As a result, any tags not present within the defined time range will be filtered out. For example, setting the value to 12h will include only tag keys/values from the past 12 hours. This feature is recommended for use with very large databases, where significant performance improvements can be observed.
+
+**For SQL**
+
+- **Insecure Connection** - Toggle to disable gRPC TLS security.
+
+### Private Data Source Connect
+
+_For Grafana Cloud only._ Private data source connect (PDC) allows you to establish a private, secured connection between a Grafana Cloud instance, or stack, and data sources secured within a private network. Click the drop-down to locate the URL for PDC. For more information regarding Grafana PDC refer to [Private data source connect (PDC)](https://grafana.com/docs/grafana-cloud/connect-externally-hosted/private-data-source-connect/).
Click **Manage private data source connect** to be taken to your PDC connection page, where you'll find your PDC configuration details.
-Once you have added your connection settings, click **Save & test** to test the data source connection.
-
-### InfluxQL-specific configuration section
-
-The following settings are specific to the InfluxQL query language option.
-
-**InfluxQL InfluxDB details section:**
-
-- **Database** - Sets the ID of the bucket to query. Refer to [View buckets](https://docs.influxdata.com/influxdb/v2.0/organizations/buckets/view-buckets/) in InfluxData's documentation on how to locate the list of available buckets and their corresponding IDs.
-- **User** - The user name used to sign in to InfluxDB.
-- **Password** - Defines the token used to query the bucket defined in **Database**. Retrieve the password from the [Tokens page](https://docs.influxdata.com/influxdb/v2.0/security/tokens/view-tokens/) of the InfluxDB UI.
-- **HTTP method** - Sets the HTTP method used to query your data source. The POST method allows for larger queries that would return an error using the GET method. The default method is `POST`.
-- **Min time interval** - _(Optional)_ Sets the minimum time interval for auto group-by. Grafana recommends setting this to match the data write frequency. For example, if your data is written every minute, it’s recommended to set this interval to 1 minute, so that each group contains data from each new write. The default is `10s`. Refer to [Min time interval](#min-time-interval) for format examples.
-- **Autocomplete range** - _(Optional)_ Sets a time range limit for the query editor's autocomplete to reduce the execution time of tag filter queries. As a result, any tags not present within the defined time range will be filtered out. For example, setting the value to 12h will include only tag keys/values from the past 12 hours. This feature is recommended for use with very large databases, where significant performance improvements can be observed.
-- **Max series** - _(Optional)_ Sets a limit on the maximum number of series or tables that Grafana processes. Set a lower limit to prevent system overload, or increase it if you have many small time series and need to display more of them. The default is `1000`.
-
-### SQL-specific configuration section
-
-The following settings are specific to the SQL query language option.
-
-**SQL InfluxDB details section:**
-
-- **Database** - Specify the **bucket ID**. Refer to the **Buckets page** in the InfluxDB UI to locate the ID.
-- **Token** The API token used for SQL queries. 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** - Toggle to disable gRPC TLS security.
-- **Max series** - _(Optional)_ Sets a limit on the maximum number of series or tables that Grafana processes. Set a lower limit to prevent system overload, or increase it if you have many small time series and need to display more of them. The default is `1000`.
-
-### Flux-specific configuration section
-
-The following settings are specific to the Flux query language option.
-
-**Flux InfluxDB details section:**
-
-- **Organization** - The [Influx organization](https://v2.docs.influxdata.com/v2.0/organizations/) used for Flux queries. Also used 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`.
-- **Default bucket** - _(Optional)_ The [Influx bucket](https://v2.docs.influxdata.com/v2.0/organizations/buckets/) used for the `v.defaultBucket` macro in Flux queries.
-- **Min time interval** - Sets the minimum time interval for auto group-by. Grafana recommends aligning this setting with the data write frequency. For example, if data is written every minute, set the interval to 1 minute to ensure each group includes data from every new write. The default is `10s`.
-- **Max series** - Sets a limit on the maximum number of series or tables that Grafana processes. Set a lower limit to prevent system overload, or increase it if you have many small time series and need to display more of them. The default is `1000`.
+After you have added your connection settings, click **Save & test** to test the data source connection.
### Min time interval
diff --git a/docs/sources/datasources/influxdb/template-variables/index.md b/docs/sources/datasources/influxdb/template-variables/index.md
index 72d48bdccbf..7165889ea00 100644
--- a/docs/sources/datasources/influxdb/template-variables/index.md
+++ b/docs/sources/datasources/influxdb/template-variables/index.md
@@ -46,9 +46,9 @@ refs:
destination: /docs/grafana//dashboards/variables/add-template-variables/#add-a-query-variable
variable-best-practices:
- pattern: /docs/grafana/
- destination: /docs/grafana//dashboards/variables/#variable-best-practices
+ destination: /docs/grafana//dashboards/variables/add-template-variables/#variable-best-practices
- pattern: /docs/grafana-cloud/
- destination: /docs/grafana-cloud/visualizations/dashboards/variables/#variable-best-practices
+ destination: /docs/grafana-cloud/visualizations/dashboards/variables/add-template-variables/#variable-best-practices
---
# InfluxDB template variables
diff --git a/docs/sources/datasources/mysql/query-editor/_index.md b/docs/sources/datasources/mysql/query-editor/_index.md
index 04a6cdc5e4e..8ec12f2789e 100644
--- a/docs/sources/datasources/mysql/query-editor/_index.md
+++ b/docs/sources/datasources/mysql/query-editor/_index.md
@@ -89,7 +89,6 @@ The following components will help you build a MySQL query:
- **Format** - Select a format response from the drop-down for the MySQL query. The default is **Table**. If you use the **Time series** format option, one of the columns must be `time`.
- **Dataset** - Select a database to query from the drop-down.
-
- **Table** - Select a table from the drop-down. Tables correspond to the chosen database.
- **Data operations** - _Optional_ Select an aggregation from the drop-down. You can add multiple data operations by clicking the **+ sign**. Click the **X** to remove a data operation. Click the **garbage can icon** to remove the entire column.
@@ -99,15 +98,12 @@ The following components will help you build a MySQL query:
- **Alias** - _Optional_ Add an alias from the drop-down. You can also add your own alias by typing it in the box and clicking **Enter**. Remove an alias by clicking the **X**.
- **Filter** - Toggle to add filters.
-
- **Filter by column value** - _Optional_ If you toggle **Filter** you can add a column to filter by from the drop-down. To filter on more columns, click the **+ sign** to the right of the condition drop-down. You can choose a variety of operators from the drop-down next to the condition. When multiple filters are added you can add an `AND` operator to display all true conditions or an `OR` operator to display any true conditions. Use the second drop-down to choose a filter. To remove a filter, click the `X` button next to that filter's drop-down. After selecting a date type column, you can choose **Macros** from the operators list and select `timeFilter` which will add the `$\_\_timeFilter` macro to the query with the selected date column.
- **Group** - Toggle to add **Group by column**.
-
- **Group by column** - Select a column to filter by from the drop-down. Click the **+ sign** to filter by multiple columns. Click the **X** to remove a filter.
- **Order** - Toggle to add an ORDER BY statement.
-
- **Order by** - Select a column to order by from the drop-down. Select ascending (`ASC`) or descending (`DESC`) order.
- **Limit** - You can add an optional limit on the number of retrieved results. Default is 50.
diff --git a/docs/sources/datasources/prometheus/configure/_index.md b/docs/sources/datasources/prometheus/configure/_index.md
index d312245e658..b68219e3866 100644
--- a/docs/sources/datasources/prometheus/configure/_index.md
+++ b/docs/sources/datasources/prometheus/configure/_index.md
@@ -148,7 +148,6 @@ Use the IP address of the Prometheus container, or the hostname if you are using
There are three authentication options for the Prometheus data source.
- **Basic authentication** - The most common authentication method.
-
- **User** - The username you use to connect to the data source.
- **Password** - The password you use to connect to the data source.
diff --git a/docs/sources/datasources/prometheus/query-editor/_index.md b/docs/sources/datasources/prometheus/query-editor/_index.md
index 31919d45e05..5be3b7cc180 100644
--- a/docs/sources/datasources/prometheus/query-editor/_index.md
+++ b/docs/sources/datasources/prometheus/query-editor/_index.md
@@ -78,7 +78,6 @@ The following video demonstrates how to use the visual Prometheus query builder:
Builder mode contains the following components:
- **Kick start your query** - Click to view a list of predefined operation patterns that help you quickly build queries with multiple operations. These include:
-
- Rate query starters
- Histogram query starters
- Binary query starters
@@ -104,7 +103,6 @@ Click **+ Operations** to select from a list of operations including Aggregation
**Options:**
- **Legend**- Lets you customize the name for the time series. You can use a predefined or custom format.
-
- **Auto** - Displays unique labels. Also displays all overlapping labels if a series has multiple labels.
- **Verbose** - Displays all label names.
- **Custom** - Lets you customize the legend using label templates. For example, `{{hostname}}` is replaced with the value of the `hostname` label. To switch to a different legend mode, clear the input and click outside the field.
@@ -112,7 +110,6 @@ Click **+ Operations** to select from a list of operations including Aggregation
- **Min step** - Sets the minimum interval between data points returned by the query. For example, setting this to `1h` suggests that data is collected or displayed at hourly intervals. This setting supports the `$__interval` and `$__rate_interval` macros. Note that the time range of the query is aligned to this step size, which may adjust the actual start and end times of the returned data.
- **Format** - Determines how the data from your Prometheus query is interpreted and visualized in a panel. Choose from the following format options:
-
- **Time series** - The default format. Refer to [Time series kind formats](https://grafana.com/developers/dataplane/timeseries/) for information on time series data frames and how time and value fields are structured.
- **Table** - Displays data in table format. This format works only in a [Table panel](ref:table).
- **Heatmap** - Displays Histogram-type metrics in a [Heatmap panel](ref:heatmap) by converting cumulative histograms to regular ones and sorting the series by the bucket bound. Converts cumulative histogram data into regular histogram format and sorts the series by bucket boundaries for proper display.
diff --git a/docs/sources/datasources/tempo/configure-tempo-data-source.md b/docs/sources/datasources/tempo/configure-tempo-data-source.md
index 39d3cdf751a..620459d765b 100644
--- a/docs/sources/datasources/tempo/configure-tempo-data-source.md
+++ b/docs/sources/datasources/tempo/configure-tempo-data-source.md
@@ -235,7 +235,6 @@ To use custom queries with the configuration, follow these steps:
1. Specify a custom query to be used to query metrics data.
Each linked query consists of:
-
- **Link Label:** _(Optional)_ Descriptive label for the linked query.
- **Query:** The query ran when navigating from a trace to the metrics data source.
Interpolate tags using the `$__tags` keyword.
@@ -321,6 +320,22 @@ You can configure this setting as follows:
| **Time shift start** | Time shift for start of search. Default: `30m`. |
| **Time shift end** | Time shift for end of search. Default: `30m`. |
+### Tags time range
+
+The **Tags time range** feature controls how tag and tag-value queries are executed by specifying the time window applied to these requests. You can select one of the following options to constrain your queries:
+
+| Name | Description |
+| ------------------- | ---------------------------------- |
+| **Last 30 minutes** | Last 30 minutes of selected range. |
+| **Last 3 hours** | Last 3 hours of selected range. |
+| **Last 24 hours** | Last 24 hours of selected range. |
+| **Last 3 days** | Last 3 days of selected range. |
+| **Last 7 days** | Last 7 days of selected range. |
+
+### Tag limit
+
+The **Tag limit** setting modifies the max number of tags and tag values to retrieve from Tempo. Default: 5000
+
### Span bar
The **Span bar** setting helps you display additional information in the span bar row.
@@ -333,10 +348,6 @@ You can choose one of three options:
| **Duration** | _(Default)_ Displays the span duration on the span bar row. |
| **Tag** | Displays the span tag on the span bar row. You must also specify which tag key to use to get the tag value, such as `component`. |
-### Tag limit
-
-The **Tag limit** setting modifies the max number of tags and tag values to retrieve from Tempo. Default: 5000
-
### Private data source connect
[//]: # 'Shared content for authentication section procedure in data sources'
diff --git a/docs/sources/datasources/tempo/traces-in-grafana/trace-correlations.md b/docs/sources/datasources/tempo/traces-in-grafana/trace-correlations.md
index 7b28419d2d5..c8f4bc4b150 100644
--- a/docs/sources/datasources/tempo/traces-in-grafana/trace-correlations.md
+++ b/docs/sources/datasources/tempo/traces-in-grafana/trace-correlations.md
@@ -45,7 +45,6 @@ To use trace correlations, you need:
1. On step 1, provide a **label** for the correlation, and an optional **description**.
1. On step 2, configure the correlation **target**.
-
- Select the **Type** drop-down list and choose **Query** to link to another data source or choose **External** for a custom URL.
- For a query **Target**, select the target drop-down list and select the data source that should be queried when the link is clicked. Define the target query.
@@ -68,7 +67,6 @@ To use trace correlations, you need:
{{< figure src="/media/docs/tempo/screenshot-grafana-trace-correlations-loki-step-2.png" max-width="900px" class="docs-image--no-shadow" alt="Setting up a correlation for a Loki target using trace variables" >}}
1. On step 3, configure the correlation data source:
-
- Select your Tempo data source in the **Source** drop-down list.
- Enter the trace data variable you use for the correlation in the **Results field**.
@@ -104,7 +102,6 @@ In this example, you configure trace to logs by service name and a trace identif
{{< figure src="/media/docs/tempo/screenshot-grafana-trace-view-correlations-example-1-step-1.png" max-width="900px" class="docs-image--no-shadow" alt="Using correlations for a trace" >}}
1. On step 2, configure the correlation target:
-
- Select the target type **Query** and select your Loki data source as **Target**.
- Define the Loki query, using `serviceName` and `traceID` as variables derived from the span data:
@@ -116,7 +113,6 @@ In this example, you configure trace to logs by service name and a trace identif
{{< figure src="/media/docs/tempo/screenshot-grafana-trace-view-correlations-example-1-step-2.png" max-width="900px" class="docs-image--no-shadow" alt="Using correlations for a trace" >}}
1. On step 3, configure the correlation source:
-
- Select your Tempo data source as **Source**.
- Use `traceID` as **Results field**.
@@ -138,7 +134,6 @@ In this example, you configure trace corrections with a custom URL.
1. On step 1, add a new correlation with the label **Open custom URL** and an optional description.
1. On step 2, configure the correlation target:
-
- Select the target type **External**.
- Define your target URL, using variables derived from the span data. In this example, we are using `serviceName` and `traceID`.
@@ -148,7 +143,6 @@ In this example, you configure trace corrections with a custom URL.
```
1. On step 3, configure the correlation source:
-
- Select your Tempo data source as **Source**.
- Use `traceID` as **Results field**.
diff --git a/docs/sources/datasources/testdata/_index.md b/docs/sources/datasources/testdata/_index.md
index fb03cebd5f5..e909f4d43f2 100644
--- a/docs/sources/datasources/testdata/_index.md
+++ b/docs/sources/datasources/testdata/_index.md
@@ -126,13 +126,9 @@ This feature is experimental and requires Grafana version 10.3.0 or later.
If you want to use a version of TestData different from the one shipped with Grafana, follow these steps:
-1. Enable the [feature toggle](https://grafana.com/docs/grafana/latest/setup-grafana/configure-grafana/feature-toggles/) `externalCorePlugins`.
1. Set the configuration field `as_external` for the plugin to `true`. An example configuration would be:
```ini
- [feature_toggles]
- externalCorePlugins = true
-
[plugin.grafana-testdata-datasource]
as_external = true
```
diff --git a/docs/sources/explore/get-started-with-explore.md b/docs/sources/explore/get-started-with-explore.md
index d42862432d4..c4a64bc9196 100644
--- a/docs/sources/explore/get-started-with-explore.md
+++ b/docs/sources/explore/get-started-with-explore.md
@@ -53,7 +53,6 @@ Explore consists of a toolbar, outline, query editor, the ability to add multipl
- **Outline** - Keeps track of the queries and visualization panels created in Explore. Refer to [Content outline](#content-outline) for more detail.
- **Toolbar** - Provides quick access to frequently used tools and settings.
-
- **Data source picker** - Select a data source from the dropdown menu, or use absolute time.
- **Split** - Click to compare visualizations side by side. Refer to [Split and compare](#split-and-compare) for additional detail.
- **Add** - Click to add your exploration to a dashboard. You can also use this to declare an incident,create a forecast, detect outliers and to run an investigation.
@@ -204,5 +203,5 @@ Now that you are familiar with Explore you can:
- [Build dashboards](https://grafana.com/docs/grafana//dashboards/build-dashboards/)
- Create a wide variety of [visualizations](https://grafana.com/docs/grafana//panels-visualizations/visualizations/)
- [Work with logs](https://grafana.com/docs/grafana//explore/logs-integration/)
-- [Work with traces](https://grafana.com/docs/grafana/)
+- [Work with traces](https://grafana.com/docs/grafana//explore/trace-integration/)
- [Create and use correlations](https://grafana.com/docs/grafana//explore/correlations-editor-in-explore/)
diff --git a/docs/sources/fundamentals/exemplars/index.md b/docs/sources/fundamentals/exemplars/index.md
index 4181c50cac5..8b556d928d6 100644
--- a/docs/sources/fundamentals/exemplars/index.md
+++ b/docs/sources/fundamentals/exemplars/index.md
@@ -101,7 +101,6 @@ This panel shows the details of the trace in different segments.
- The next segment shows the entire span for the specific trace as a narrow strip.
All levels of the trace from the client all the way down to database query is displayed, which provides a bird's eye view of the time distribution across all layers over which the HTTP request was processed.
-
1. You can click within this strip view to display a magnified view of a smaller time segment within the span. This magnified view shows up in the bottom segment of the panel.
1. In the magnified view, you can expand or collapse the various levels of the trace to drill down to the specific span of interest.
diff --git a/docs/sources/observability-as-code/foundation-sdk/dashboard-automation.md b/docs/sources/observability-as-code/foundation-sdk/dashboard-automation.md
index 341fbd2af8c..6ae3821e58a 100644
--- a/docs/sources/observability-as-code/foundation-sdk/dashboard-automation.md
+++ b/docs/sources/observability-as-code/foundation-sdk/dashboard-automation.md
@@ -167,7 +167,7 @@ jobs:
- name: Set up Go
uses: actions/setup-go@v5
with:
- go-version: 1.24.4
+ go-version: 1.24.5
- name: Verify Go version
run: go version
@@ -208,7 +208,7 @@ This GitHub Action automates the deployment of a Grafana dashboard using the Fou
The first few steps:
- Check out the repository to access the project code.
-- Install Go 1.24.4 using the `actions/setup-go` action.
+- Install Go 1.24.5 using the `actions/setup-go` action.
- Verify Go is properly installed.
### 2. Download and install `grafanactl`
diff --git a/docs/sources/observability-as-code/get-started.md b/docs/sources/observability-as-code/get-started.md
index 00b48501f95..ef9822aae5c 100644
--- a/docs/sources/observability-as-code/get-started.md
+++ b/docs/sources/observability-as-code/get-started.md
@@ -68,17 +68,14 @@ Refer to the [Foundation SDK](../foundation-sdk) documentation for more informat
If you're already using established Infrastructure as Code or other configuration management tools, Grafana offers integrations to manage resources within your existing workflows.
- [Terraform](https://grafana.com/docs/grafana-cloud/developer-resources/infrastructure-as-code/terraform/)
-
- Use the Grafana Terraform provider to manage dashboards, alerts, and more.
- Understand how to define and deploy resources using HCL/JSON configurations.
- [Ansible](https://grafana.com/docs/grafana-cloud/developer-resources/infrastructure-as-code/ansible/)
-
- Learn to use the Grafana Ansible collection to manage Grafana Cloud resources, including folders and cloud stacks.
- Write playbooks to automate resource provisioning through the Grafana API.
- [Grafana Operator](https://grafana.com/docs/grafana-cloud/developer-resources/infrastructure-as-code/grafana-operator/)
-
- Utilize Kubernetes-native management with the Grafana Operator.
- Manage dashboards, folders, and data sources via Kubernetes Custom Resources.
- Integrate with GitOps workflows for seamless version control and deployment.
diff --git a/docs/sources/observability-as-code/provision-resources/git-sync-setup.md b/docs/sources/observability-as-code/provision-resources/git-sync-setup.md
index 4a81b71a197..b0c44727ffd 100644
--- a/docs/sources/observability-as-code/provision-resources/git-sync-setup.md
+++ b/docs/sources/observability-as-code/provision-resources/git-sync-setup.md
@@ -87,7 +87,6 @@ This token needs to be added to your Git Sync configuration to enable read and w
1. Create a new token using [Create new fine-grained personal access token](https://github.com/settings/personal-access-tokens/new). Refer to [Managing your personal access tokens](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/managing-your-personal-access-tokens) for instructions.
1. Under **Permissions**, expand **Repository permissions**.
1. Set these permissions for Git Sync:
-
- **Contents**: Read and write permission
- **Metadata**: Read-only permission
- **Pull requests**: Read and write permission
diff --git a/docs/sources/observability-as-code/provision-resources/provisioned-dashboards.md b/docs/sources/observability-as-code/provision-resources/provisioned-dashboards.md
index 8ab3afa9c03..e92bb0800dc 100644
--- a/docs/sources/observability-as-code/provision-resources/provisioned-dashboards.md
+++ b/docs/sources/observability-as-code/provision-resources/provisioned-dashboards.md
@@ -97,7 +97,6 @@ Saving changes requires opening a pull request in your GitHub repository.
1. Click **Save dashboard**.
1. On the **Provisioned dashboard** panel, choose the options you want to use:
-
- **Update default refresh value**: Check this box to make the current refresh the new default.
- **Update default variable values**: Check this box to make the current values the new default.
- **Path**: Provide the path for your repository, ending in a JSON or YAML file.
diff --git a/docs/sources/panels-visualizations/configure-panel-options/index.md b/docs/sources/panels-visualizations/configure-panel-options/index.md
index 59c466a20fb..dc7c8601c11 100644
--- a/docs/sources/panels-visualizations/configure-panel-options/index.md
+++ b/docs/sources/panels-visualizations/configure-panel-options/index.md
@@ -90,7 +90,6 @@ To configure repeating panels, follow these steps:
1. Open the **Panel options** section of the panel editor pane.
1. Under **Repeat options**, select a variable in the **Repeat by variable** drop-down list.
1. Under **Repeat direction**, choose one of the following:
-
- **Horizontal** - Arrange panels side-by-side. Grafana adjusts the width of a repeated panel. You can't mix other panels on a row with a repeated panel.
- **Vertical** - Arrange panels in a column. The width of repeated panels is the same as the original, repeated panel.
diff --git a/docs/sources/panels-visualizations/configure-standard-options/index.md b/docs/sources/panels-visualizations/configure-standard-options/index.md
index a27bd238a4f..2e737ed7de2 100644
--- a/docs/sources/panels-visualizations/configure-standard-options/index.md
+++ b/docs/sources/panels-visualizations/configure-standard-options/index.md
@@ -198,7 +198,6 @@ To display timestamps that are in seconds since epoch, multiply your timestamp v
1. Click **Add transformation**.
1. Select the **Add field from calculation** transformation.
1. Set the following options:
-
- **Mode** - **Binary operation**
- **Operation**
- Select your timestamp field
diff --git a/docs/sources/panels-visualizations/configure-value-mappings/index.md b/docs/sources/panels-visualizations/configure-value-mappings/index.md
index 82231549084..11223d3870b 100644
--- a/docs/sources/panels-visualizations/configure-value-mappings/index.md
+++ b/docs/sources/panels-visualizations/configure-value-mappings/index.md
@@ -184,7 +184,6 @@ The following image shows a table visualization with value mappings. If you want
1. Scroll to the **Value mappings** section and expand it.
1. Click **Add value mappings**.
1. Click **Add a new mapping** and then select one of the following:
-
- **Value** - Enter a single value to match.
- **Range** - Enter the beginning and ending values of a range to match.
- **Regex** - Enter a regular expression pattern to match.
diff --git a/docs/sources/panels-visualizations/panel-inspector/index.md b/docs/sources/panels-visualizations/panel-inspector/index.md
index a8086224d08..d751957a171 100644
--- a/docs/sources/panels-visualizations/panel-inspector/index.md
+++ b/docs/sources/panels-visualizations/panel-inspector/index.md
@@ -43,7 +43,6 @@ Grafana generates a CSV file that contains your data, including any transformati
1. Click **Data**.
If your panel contains multiple queries or queries multiple nodes, then you have additional options.
-
- **Select result**: Choose which result set data you want to view.
- **Transform data**
- **Join by time**: View raw data from all your queries at once, one result set per column. Click a column heading to reorder the data.
diff --git a/docs/sources/panels-visualizations/query-transform-data/sql-expressions/index.md b/docs/sources/panels-visualizations/query-transform-data/sql-expressions/index.md
index 7d891f8e9b6..54fd4f8f6cc 100644
--- a/docs/sources/panels-visualizations/query-transform-data/sql-expressions/index.md
+++ b/docs/sources/panels-visualizations/query-transform-data/sql-expressions/index.md
@@ -32,7 +32,6 @@ For general information on Grafana expressions, refer to [Write expression queri
## Before you begin
- Enable SQL expressions under the feature toggle `sqlExpressions`.
-
- If you self-host Grafana, you can find feature toggles in the configuration file `grafana.ini`.
```
@@ -150,6 +149,7 @@ The SQL conversion path:
- Currently, only one SQL expression is supported per panel or alert.
- Grafana supports certain data sources. Refer to [compatible data sources](#compatible-data-sources) for a current list.
+- Autocomplete is available, but column/field autocomplete is only available after enabling the `sqlExpressionsColumnAutoComplete` feature toggle, which is provided on an experimental basis.
## Supported data source formats
@@ -157,12 +157,10 @@ Grafana supports three types of data source response formats:
1. **Single Table-like Frame**:
This refers to data returned in a standard tabular structure, where all values are organized into rows and columns, similar to what you'd get from a SQL query.
-
- **Example**: Any query against a SQL data source (e.g., PostgreSQL, MySQL) with the format set to Table.
2. **Dataplane: Time Series Format**:
This format represents time series data with timestamps and associated values. It is typically returned from monitoring data sources.
-
- **Example**: Prometheus or Loki Range Queries (queries that return a set of values over time).
3. **Dataplane: Numeric Long Format**:
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 7782acad459..033115c665c 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
@@ -88,6 +88,8 @@ Transformations are a powerful way to manipulate data returned by a query before
- Perform mathematical operations across queries
- Use the output of one transformation as the input to another transformation
+{{< docs/learning-journeys title="Transform data in a Grafana Cloud dashboard" url="https://grafana.com/docs/learning-journeys/data-transformation/" >}}
+
For users that rely on multiple views of the same dataset, transformations offer an efficient method of creating and maintaining numerous dashboards.
You can also use the output of one transformation as the input to another transformation, which results in a performance gain.
@@ -645,7 +647,7 @@ After choosing which field you want to group your data by, you can add various c
| server 2 | 88.6 |
| server 3 | 59.6 |
-If you had added the count stat to the group by, there would be an extra column showing that the count of each server from above was 3.
+If you had added the count stat to the group by transformation, there would be an extra column showing that the count of each server from above was 3.
| Server ID | CPU Temperature (mean) | Server ID (count) |
| --------- | ---------------------- | ----------------- |
diff --git a/docs/sources/panels-visualizations/visualizations/bar-chart/index.md b/docs/sources/panels-visualizations/visualizations/bar-chart/index.md
index 44d0922b454..33b2bce6bfc 100644
--- a/docs/sources/panels-visualizations/visualizations/bar-chart/index.md
+++ b/docs/sources/panels-visualizations/visualizations/bar-chart/index.md
@@ -130,7 +130,6 @@ Set the mode of the gradient fill. Fill gradient is based on the line color. To
- **Opacity** - Transparency of the gradient is calculated based on the values on the y-axis. Opacity of the fill is increasing with the values on the Y-axis.
- **Hue** - Gradient color is generated based on the hue of the line color.
- **Scheme** - The bar receives a gradient color defined by the **Standard options > Color scheme** selection.
-
- **From thresholds** - If the **Color scheme** selection is **From thresholds (by value)**, then each bar is the color of the defined threshold.
{{< figure src="/media/docs/grafana/panels-visualizations/screenshot-colors-by-thresholds-v11.3.png" alt="Color scheme From thresholds" caption="Color scheme: From thresholds" >}}
diff --git a/docs/sources/panels-visualizations/visualizations/canvas/index.md b/docs/sources/panels-visualizations/visualizations/canvas/index.md
index cef103b2424..4be10911af6 100644
--- a/docs/sources/panels-visualizations/visualizations/canvas/index.md
+++ b/docs/sources/panels-visualizations/visualizations/canvas/index.md
@@ -470,7 +470,6 @@ You can style the selected connection using the following options:
- **Size** - Control the size of the connection by entering a number in the **Value** field.
- **Radius** - Add curve to the connection by entering a value to represent the degree.
- **Arrow Direction** - Control the appearance of the arrow head. Choose from:
-
- **Forward** - The arrow head points in the direction in which the connection was drawn.
- **Reverse** - The arrow head points in the opposite direction of which the connection was drawn.
- **Both** - Adds arrow heads to both ends of the connection.
diff --git a/docs/sources/panels-visualizations/visualizations/table/index.md b/docs/sources/panels-visualizations/visualizations/table/index.md
index eb47c849ca1..707acfababc 100644
--- a/docs/sources/panels-visualizations/visualizations/table/index.md
+++ b/docs/sources/panels-visualizations/visualizations/table/index.md
@@ -59,6 +59,11 @@ refs:
destination: /docs/grafana//panels-visualizations/query-transform-data/
- pattern: /docs/grafana-cloud/
destination: /docs/grafana-cloud/visualizations/panels-visualizations/query-transform-data/
+ graph-styles:
+ - pattern: /docs/grafana/
+ destination: /docs/grafana//panels-visualizations/visualizations/time-series/#graph-styles-options
+ - pattern: /docs/grafana-cloud/
+ destination: /docs/grafana-cloud/visualizations/panels-visualizations/visualizations/time-series/#graph-styles-options
---
# Table
@@ -155,7 +160,6 @@ To filter column values, follow these steps:
1. Click the checkbox next to the values that you want to display or click **Select all**.
1. Enter text in the search field at the top to show those values in the display so that you can select them rather than scroll to find them.
1. Choose from several operators to display column values:
-
- **Contains** - Matches a regex pattern (operator by default).
- **Expression** - Evaluates a boolean expression. The character `$` represents the column value in the expression (for example, "$ >= 10 && $ <= 12").
- The typical comparison operators: `=`, `!=`, `<`, `<=`, `>`, `>=`.
@@ -217,11 +221,8 @@ After you activate the table footer, make selections for the following options:
### Cell options
Cell options allow you to control how data is displayed in a table.
-The options are:
-
-- [Cell type](#cell-type) - Control the default cell display settings.
-- [Wrap text](#wrap-text) - Wrap text in the cell that contains the longest content in your table.
-- [Cell value inspect](#cell-value-inspect) - Enables value inspection from table cells.
+The options are differ based on the cell type that you select and are outlined within the descriptions of each cell type.
+The following table provides short descriptions for each cell type and links to a longer description and the cell type options.
#### Cell type
@@ -231,50 +232,88 @@ Additional configuration is available for some cell types.
If you want to apply a cell type to only some fields instead of all fields, you can do so using the **Cell options > Cell type** field override.
-| Cell type | Description |
-| ----------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| Auto | Automatically displays values with sensible defaults applied. |
-| [Sparkline](#sparkline) | Shows values rendered as a sparkline. |
-| [Colored text](#colored-text) | If thresholds are set, then the field text is displayed in the appropriate threshold color. |
-| [Colored background](#colored-background) | If thresholds are set, then the field background is displayed in the appropriate threshold color. |
-| [Gauge](#gauge) | Cells can be displayed as a graphical gauge, with several different presentation types. You can set the [Gauge display mode](#gauge-display-mode) and the [Value display](#value-display) options. |
+
+| Cell type | Description |
+| ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
+| [Auto](#auto) | A basic text and number cell. |
+| [Sparkline](#sparkline) | Shows values rendered as a sparkline. |
+| [Colored text](#colored-text) | If thresholds, value mappings, or color schemes are set, then the cell text is displayed in the appropriate color. |
+| [Colored background](#colored-background) | If thresholds, value mappings, or color schemes are set, then the cell background is displayed in the appropriate color. |
+| [Gauge](#gauge) | Values are displayed as a horizontal bar gauge. You can set the [Gauge display mode](#gauge-display-mode) and the [Value display](#value-display) options. |
| Data links | If you've configured data links, when the cell type is **Auto**, the cell text becomes clickable. If you change the cell type to **Data links**, the cell text reflects the titles of the configured data links. To control the application of data link text more granularly, use a **Cell option > Cell type > Data links** field override. |
-| [JSON View](#json-view) | Shows values formatted as code. |
-| [Image](#image) | If the field value is an image URL or a base64 encoded image, the table displays the image. |
-| [Actions](#actions) | The cell displays a button that triggers a basic, unauthenticated API call when clicked. |
+| [JSON View](#json-view) | Shows values formatted as code. |
+| [Image](#image) | Displays an image when the value is a URL or a base64 encoded image. |
+| [Actions](#actions) | The cell displays a button that triggers a basic, unauthenticated API call when clicked. |
+
-##### Sparkline
+#### Auto
+
+This is a basic text and number cell.
+
+It has the following cell options:
+
+{{< docs/shared lookup="visualizations/cell-options.md" source="grafana" version="" >}}
+
+#### Sparkline
This cell type shows values rendered as a sparkline.
To show sparklines on data with multiple time series, use the [Time series to table transformation](ref:time-series-to-table-transformation) to process it into a format the table can show.

-You can customize sparklines with many of the same options as the [time series visualization](ref:time-series-panel) including line style and width, fill opacity, gradient mode, and more.
-You can also change the color of the sparkline by updating the [color scheme](ref:color-scheme) in the **Standard options** section of the panel configuration.
+The sparkline cell type options are described in the following table.
+For more detailed information about all of the sparkline styling options (except **Hide value**), refer to the [time series graph styles documentation](ref:graph-styles).
-##### Colored text
+
+| Option | Description |
+| ------------------- | --------------------------------------------------------------------------------------------- |
+| Hide value | Toggle the switch on or off to display or hide the cell value on the sparkline. |
+| Style | Choose whether to display your time-series data as **Lines**, **Bars**, or **Points**. You can use overrides to combine multiple styles in the same graph. |
+| Line interpolation | How the graph interpolates the series line. Choose from:
**Linear** - Points are joined by straight lines.
**Smooth** - Points are joined by curved lines that smooths transitions between points.
**Step before** - The line is displayed as steps between points. Points are rendered at the end of the step.
**Step after** - The line is displayed as steps between points. Points are rendered at the beginning of the step.
|
+| Line width | The thickness of the series lines or the outline for bars using the **Line width** slider. |
+| Fill opacity | The series area fill color using the **Fill opacity** slider. |
+| Gradient mode | Gradient mode controls the gradient fill, which is based on the series color. Gradient appearance is influenced by the **Fill opacity** setting. To change the color, use the standard color scheme field option. For more information, refer to [Color scheme](ref:color-scheme). Choose from:
**None** - No gradient fill. This is the default setting.
**Opacity** - An opacity gradient where the opacity of the fill increases as y-axis values increase.
**Hue** - A subtle gradient that's based on the hue of the series color.
|
+| Line style | Choose from:
**Solid**
**Dash** - Select the length and gap for the line dashes. Default dash spacing is 10, 10.
**Dots** - Select the gap for the dot spacing. Default dot spacing is 0, 10.
|
+| Connect null values | How null values, which are gaps in the data, appear on the graph. Null values can be connected to form a continuous line or set to a threshold above which gaps in the data are no longer connected. Choose from:
**Never** - Time series data points with gaps in the data are never connected.
**Always** - Time series data points with gaps in the data are always connected.
**Threshold** - Specify a threshold above which gaps in the data are no longer connected. This can be useful when the connected gaps in the data are of a known size or within a known range, and gaps outside this range should no longer be connected.
|
+| Show points | Whether to show data points to lines or bars. Choose from:
**Auto** - Grafana determines a point's visibility based on the density of the data. If the density is low, then points appear.
**Always** - Show the points regardless of how dense the dataset is.
**Never** - Don't show points.
|
+| Point size | Set the size of the points, from 1 to 40 pixels in diameter. |
+| Bar alignment | Set the position of the bar relative to a data point. |
+
-If thresholds are set, with this cell type, the field text is displayed in the appropriate threshold color.
+#### Colored text
+
+If thresholds, value mappings, or color schemes are set, the cell text is displayed in the appropriate color.

-{{< admonition type="note" >}}
-This is an experimental feature.
-{{< /admonition >}}
+The colored text cell type has the following options:
-##### Colored background
+{{< docs/shared lookup="visualizations/cell-options.md" source="grafana" version="" >}}
-If thresholds are set, with this cell type, the field background is displayed in the appropriate threshold color.
+#### Colored background
+
+If thresholds, value mappings, or color schemes are set, the cell background is displayed in the appropriate color.

-- **Background display mode** - Choose between **Basic** and **Gradient**.
-- **Apply to entire row** - Toggle the switch on to apply the background color that's configured for the cell to the whole row.
+You can also set background cell color by row:

-##### Gauge
+The colored background cell type has the following options:
+
+
+| Option | Description |
+| ------ | ----------- |
+| Background display mode | Choose between **Basic** and **Gradient**. |
+| Apply to entire row | Toggle the switch on to apply the background color that's configured for the cell to the whole row. |
+| Wrap text |
Toggle the **Wrap text** switch to wrap text in the cell that contains the longest content in your table. To wrap the text _in a specific column only_, use a **Fields with name** [field override](ref:field-override), select the **Cell options > Cell type** override property, and toggle on the **Wrap text** switch.
Text wrapping is in [public preview](https://grafana.com/docs/release-life-cycle/#public-preview), however, it’s available to use by default.
|
+| Cell value inspect |
Enables value inspection from table cells. When the switch is toggled on, clicking the inspect icon in a cell opens the **Inspect value** drawer which contains two tabs: **Plain text** and **Code editor**.
Grafana attempts to automatically detect the type of data in the cell and opens the drawer with the associated tab showing. However, you can switch back and forth between tabs.
|
+
+
+
+
+#### Gauge
With this cell type, cells can be displayed as a graphical gauge, with several different presentation types controlled by the [gauge display mode](#gauge-display-mode) and the [value display](#value-display).
@@ -283,53 +322,58 @@ The maximum and minimum values of the gauges are configured automatically from t
If you don't want the max/min values to be pulled from the whole dataset, you can configure them for each column using [field overrides](#field-overrides).
{{< /admonition >}}
-###### Gauge display mode
+##### Gauge display mode
You can set three gauge display modes.
-
| Option | Description |
| ------ | ----------- |
| Basic | Shows a simple gauge with the threshold levels defining the color of gauge. {{< figure src="/media/docs/grafana/panels-visualizations/screenshot-gauge-mode-basic-v11.3.png" alt="Table cell with basic gauge mode" >}} |
| Gradient | The threshold levels define a gradient. {{< figure src="/media/docs/grafana/panels-visualizations/screenshot-gauge-mode-gradient-v11.3.png" alt="Table cell with gradient gauge mode" >}} |
| Retro LCD | The gauge is split up in small cells that are lit or unlit. {{< figure src="/media/docs/grafana/panels-visualizations/screenshot-gauge-mode-retro-v11.3.png" alt="Table cell with retro LCD gauge mode" >}} |
-
-###### Value display
+##### Value display
Labels displayed alongside of the gauges can be set to be colored by value, match the theme text color, or be hidden.
-
| Option | Description |
| ------ | ----------- |
| Value color | Labels are colored by value. {{< figure src="/media/docs/grafana/panels-visualizations/screenshot-labels-value-color-v11.3.png" alt="Table with labels in value color" >}} |
| Text color | Labels match the theme text color. {{< figure src="/media/docs/grafana/panels-visualizations/screenshot-labels-text-color-v11.3.png" alt="Table with labels in theme color" >}} |
| Hidden | Labels are hidden. {{< figure src="/media/docs/grafana/panels-visualizations/screenshot-labels-hidden-v11.3.png" alt="Table with labels hidden" >}} |
-
-##### JSON View
+#### JSON View
This cell type shows values formatted as code.
If a value is an object the JSON view allowing browsing the JSON object will appear on hover.
{{< figure src="/static/img/docs/tables/json-view.png" max-width="350px" alt="JSON view" class="docs-image--no-shadow" >}}
-##### Image
+For the JSON view cell type, you can set enable **Cell value inspect**.
+This enables value inspection from table cells.
+When the switch is toggled on, clicking the inspect icon in a cell opens the **Inspect value** drawer which contains two tabs: **Plain text** and **Code editor**.
+
+Grafana attempts to automatically detect the type of data in the cell and opens the drawer with the associated tab showing.
+However, you can switch back and forth between tabs
+
+#### Image
If you have a field value that is an image URL or a base64 encoded image, this cell type displays it as an image.

-Set the following options:
+It has the following options:
-- **Alt text** - Set the alternative text of an image. The text will be available for screen readers and in cases when images can't be loaded.
-- **Title text** - Set the text that's displayed when the image is hovered over with a cursor.
+| Option | Description |
+| ---------- | ----------------------------------------------------------------------------------------------------------------------------- |
+| Alt text | Set the alternative text of an image. The text will be available for screen readers and in cases when images can't be loaded. |
+| Title text | Set the text that's displayed when the image is hovered over with a cursor. |
-##### Actions
+#### Actions
The cell displays a button that triggers a basic, unauthenticated API call when clicked.
Configure the API call with the following options:
@@ -343,34 +387,8 @@ Configure the API call with the following options:
| Query parameters | Enter as many **Key**, **Value** pairs as you need. |
| Header parameters | Enter as many **Key**, **Value** pairs as you need. |
| Payload | Enter the body of the API call. |
-
-#### Wrap text
-
-{{< admonition type="note" >}}
-Text wrapping is in [public preview](https://grafana.com/docs/release-life-cycle/#public-preview), however, it’s available to use by default.
-We’d love hear from you about how this new feature is working. To provide feedback, you can open an issue in the [Grafana GitHub repository](https://github.com/grafana/grafana).
-{{< /admonition >}}
-
-Toggle the **Wrap text** switch to wrap text in the cell that contains the longest content in your table.
-
-To wrap the text _in a specific column only_, use a **Fields with name** [field override](ref:field-override), select the **Cell options > Cell type** override property, and toggle on the **Wrap text** switch.
-
-This option is available for the following cell types: **Auto**, **Colored text**, and **Colored background**.
-
-#### Cell value inspect
-
-Enables value inspection from table cells. When the **Cell inspect value** switch is toggled on, clicking the inspect icon in a cell opens the **Inspect value** drawer.
-
-The **Inspect value** drawer has two tabs, **Plain text** and **Code editor**.
-Grafana attempts to automatically detect the type of data in the cell and opens the drawer with the associated tab showing.
-However, you can switch back and forth between tabs.
-
-This option is available for the following cell types: **Auto**, **Colored text**, **Colored background**, and **JSON View**.
-
-If you want to apply this setting to only some fields instead of all fields, you can do so using the **Cell options > Cell value inspect** field override.
-
### Standard options
{{< docs/shared lookup="visualizations/standard-options.md" source="grafana" version="" >}}
diff --git a/docs/sources/panels-visualizations/visualizations/traces/index.md b/docs/sources/panels-visualizations/visualizations/traces/index.md
index a82d0be2662..abf7fc1ddc3 100644
--- a/docs/sources/panels-visualizations/visualizations/traces/index.md
+++ b/docs/sources/panels-visualizations/visualizations/traces/index.md
@@ -91,7 +91,6 @@ This procedure uses dashboard variables and templates to allow you to enter trac
1. From your Grafana stack, create a new dashboard or go to an existing dashboard where you'd like to add traces visualizations.
1. Do one of the following:
-
- New dashboard - Click **+ Add visualization**.
- Existing dashboard - Click **Edit** in the top-right corner and then select **Visualization** in the **Add** drop-down.
diff --git a/docs/sources/setup-grafana/configure-grafana/_index.md b/docs/sources/setup-grafana/configure-grafana/_index.md
index 1ce20139b48..a79ccc33e70 100644
--- a/docs/sources/setup-grafana/configure-grafana/_index.md
+++ b/docs/sources/setup-grafana/configure-grafana/_index.md
@@ -2655,8 +2655,6 @@ If `true`, propagate the tracing context to the plugin backend and enable tracin
Load an external version of a core plugin if it has been installed.
-Experimental. Requires the feature toggle `externalCorePlugins` to be enabled.
-
### `[plugin.grafana-image-renderer]`
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 a471a92f08c..cc448ec4ba3 100644
--- a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md
+++ b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md
@@ -35,14 +35,12 @@ Most [generally available](https://grafana.com/docs/release-life-cycle/#general-
| `influxdbBackendMigration` | Query InfluxDB InfluxQL without the proxy | Yes |
| `dataplaneFrontendFallback` | Support dataplane contract field name change for transformations and field name matchers where the name is different | Yes |
| `unifiedRequestLog` | Writes error logs to the request logger | Yes |
-| `pluginsDetailsRightPanel` | Enables right panel for the plugins details page | Yes |
| `recordedQueriesMulti` | Enables writing multiple items from a single query within Recorded Queries | Yes |
| `logsExploreTableVisualisation` | A table visualisation for logs in Explore | Yes |
| `awsDatasourcesTempCredentials` | Support temporary security credentials in AWS plugins for Grafana Cloud customers | 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 |
| `dashgpt` | Enable AI powered features in dashboards | Yes |
-| `externalCorePlugins` | Allow core plugins to be loaded as external | Yes |
| `panelMonitoring` | Enables panel monitoring through logs and measurements | Yes |
| `formatString` | Enable format string transformer | Yes |
| `kubernetesClientDashboardsFolders` | Route the folder and dashboard service requests to k8s | Yes |
@@ -108,6 +106,7 @@ Most [generally available](https://grafana.com/docs/release-life-cycle/#general-
| `elasticsearchCrossClusterSearch` | Enables cross cluster search in the Elasticsearch datasource |
| `alertRuleRestore` | Enables the alert rule restore feature |
| `azureMonitorLogsBuilderEditor` | Enables the logs builder mode for the Azure Monitor data source |
+| `localeFormatPreference` | Specifies the locale so the correct format for numbers and dates can be shown |
| `logsPanelControls` | Enables a control component for the logs panel in Explore |
## Development feature toggles
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 f381c212abb..3d1c4a48a6b 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
@@ -120,9 +120,7 @@ In this example we use Apache as a reverse proxy in front of Grafana. Apache han
- The first four lines of the virtualhost configuration are standard, so we won’t go into detail on what they do.
- We use a **\** configuration block for applying our authentication rules to every proxied request. These rules include requiring basic authentication where user:password credentials are stored in the **/etc/apache2/grafana_htpasswd** file. This file can be created with the `htpasswd` command.
-
- The next part of the configuration is the tricky part. We use Apache’s rewrite engine to create our **X-WEBAUTH-USER header**, populated with the authenticated user.
-
- **RewriteRule .\* - [E=PROXY_USER:%{LA-U:REMOTE_USER}, NS]**: This line is a little bit of magic. What it does, is for every request use the rewriteEngines look-ahead (LA-U) feature to determine what the REMOTE_USER variable would be set to after processing the request. Then assign the result to the variable PROXY_USER. This is necessary as the REMOTE_USER variable is not available to the RequestHeader function.
- **RequestHeader set X-WEBAUTH-USER “%{PROXY_USER}e”**: With the authenticated username now stored in the PROXY_USER variable, we create a new HTTP request header that will be sent to our backend Grafana containing the username.
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 a4ce61cd31a..69e6e1415f0 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
@@ -42,16 +42,12 @@ To enable the Azure AD/Entra ID OAuth, register your application with Entra ID.
1. Note the **Application ID**. This is the OAuth client ID.
1. Click **Endpoints** from the top menu.
-
- Note the **OAuth 2.0 authorization endpoint (v2)** URL. This is the authorization URL.
- Note the **OAuth 2.0 token endpoint (v2)**. This is the token URL.
1. Click **Certificates & secrets** in the side menu, then add a new entry under the supported client authentication option you want to use. The following are the supported client authentication options with their respective configuration steps.
-
- **Client secrets**
-
1. Add a new entry under **Client secrets** with the following configuration.
-
- Description: Grafana OAuth 2.0
- Expires: Select an expiration period
@@ -60,16 +56,12 @@ To enable the Azure AD/Entra ID OAuth, register your application with Entra ID.
{{< admonition type="note" >}}
Make sure that you copy the string in the **Value** field, rather than the one in the **Secret ID** field.
{{< /admonition >}}
-
1. You must have set `client_authentication` under `[auth.azuread]` to `client_secret_post` in the Grafana server configuration for this to work.
- **Federated credentials**
-
- **_Managed Identity_**
-
1. Refer to [Configure an application to trust a managed identity (preview)](https://learn.microsoft.com/en-us/entra/workload-id/workload-identity-federation-config-app-trust-managed-identity?tabs=microsoft-entra-admin-center) for a complete guide on setting up a managed identity as a federated credential.
Add a new entry under Federated credentials with the following configuration.
-
- Federated credential scenario: Select **Other issuer**.
- Issuer: The OAuth 2.0 / OIDC issuer URL of the Microsoft Entra ID authority. For example: `https://login.microsoftonline.com/{tenantID}/v2.0`.
- Subject identifier: The Object (Principal) ID GUID of the Managed Identity.
@@ -88,10 +80,8 @@ To enable the Azure AD/Entra ID OAuth, register your application with Entra ID.
{{< /admonition >}}
- **_Workload Identity (K8s/AKS)_**
-
1. Refer to [Federated identity credential for an Azure AD application](https://azure.github.io/azure-workload-identity/docs/topics/federated-identity-credential.html#azure-portal-ui) for a complete guide on setting up a federated credential for workload identity.
Add a new entry under Federated credentials with the following configuration.
-
- Federated credential scenario: Select **Kubernetes accessing Azure resources**.
- [Cluster issuer URL](https://learn.microsoft.com/en-us/azure/aks/use-oidc-issuer#get-the-oidc-issuer-url): The OIDC issuer URL that your cluster is integrated with. For example: `https://{region}.oic.prod-aks.azure.com/{tenant_id}/{uuid}`.
- Namespace: Namespace of your Grafana deployment. For example: `grafana`.
@@ -141,7 +131,6 @@ This section describes setting up basic application roles for Grafana within the
1. Click **App roles** and then **Create app role**.
1. Define a role corresponding to each Grafana role: Viewer, Editor, and Admin.
-
1. Choose a **Display name** for the role. For example, "Grafana Editor".
1. Set the **Allowed member types** to **Users/Groups**.
@@ -271,6 +260,10 @@ resource "grafana_sso_settings" "azuread_sso_settings" {
allow_assign_grafana_admin = false
skip_org_role_sync = false
use_pkce = true
+ custom = {
+ domain_hint = "contoso.com"
+ force_use_graph_api = "true"
+ }
}
}
```
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 9e10faee645..9ebe70e6e55 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
@@ -450,7 +450,6 @@ Support for the Auth0 "audience" feature is not currently available in Grafana.
To set up Generic OAuth authentication with Auth0, follow these steps:
1. Create an Auth0 application using the following parameters:
-
- Name: Grafana
- Type: Regular Web Application
@@ -485,7 +484,6 @@ To set up Generic OAuth authentication with Bitbucket, follow these steps:
1. Navigate to **Settings > Workspace setting > OAuth consumers** in BitBucket.
1. Create an application by selecting **Add consumer** and using the following parameters:
-
- Allowed Callback URLs: `https:///login/generic_oauth`
1. Click **Save**.
@@ -518,7 +516,6 @@ By default, a refresh token is included in the response for the **Authorization
To set up Generic OAuth authentication with OneLogin, follow these steps:
1. Create a new Custom Connector in OneLogin with the following settings:
-
- Name: Grafana
- Sign On Method: OpenID Connect
- Redirect URI: `https:///login/generic_oauth`
@@ -526,7 +523,6 @@ To set up Generic OAuth authentication with OneLogin, follow these steps:
- Login URL: `https:///login/generic_oauth`
1. Add an app to the Grafana Connector:
-
- Display Name: Grafana
1. Update the `[auth.generic_oauth]` section of the Grafana configuration file using the client ID and client secret from the **SSO** tab of the app details page:
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 3ab7695554c..22363e59b54 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
@@ -88,7 +88,6 @@ Ensure that you have access to the [Grafana configuration file](../../../configu
To configure GitLab authentication with Grafana, follow these steps:
1. Create an OAuth application in GitLab.
-
1. Set the redirect URI to `http://:/login/gitlab`.
Ensure that the Redirect URI is the complete HTTP address that you use to access Grafana via your browser, but with the appended path of `/login/gitlab`.
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/ldap-ui/_index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/ldap-ui/_index.md
index 7deaab7f849..ea8ec60d0f5 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/ldap-ui/_index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/ldap-ui/_index.md
@@ -87,7 +87,6 @@ Map LDAP groups to Grafana roles.
1. **Manage group mappings**:
When managing group mappings, the following fields are available. To add a new group mapping, click the **Add group mapping** button.
-
1. **Add a group DN mapping**: The name of the key used to extract the ID token.
1. **Add an organization role mapping**: Select the Basic Role mapped to this group.
1. **Add the organization ID membership mapping**: Map the group to an organization ID.
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/ldap/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/ldap/index.md
index 872aab03a97..fac378a498c 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/ldap/index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/ldap/index.md
@@ -134,6 +134,10 @@ email = "email"
Whenever you modify the ldap.toml file, you must restart Grafana in order for the change(s) to take effect.
{{< /admonition >}}
+### Using the Grafana user interface
+
+You can configure LDAP using the Grafana user interface by navigating to **Administration > Authentication > LDAP**. Please refer to the [LDAP user interface](../ldap-ui/) documentation for more information.
+
### Using environment variables
You can interpolate variables in the TOML configuration from environment variables. For instance, you could externalize your `bind_password` that way:
@@ -142,28 +146,6 @@ You can interpolate variables in the TOML configuration from environment variabl
bind_password = "${LDAP_ADMIN_PASSWORD}"
```
-## LDAP debug view
-
-Grafana has an LDAP debug view built-in which allows you to test your LDAP configuration directly within Grafana. Only Grafana admins can use the LDAP debug view.
-
-Within this view, you'll be able to see which LDAP servers are currently reachable and test your current configuration.
-
-{{< figure src="/static/img/docs/ldap_debug.png" class="docs-image--no-shadow" max-width="600px" alt="LDAP testing" >}}
-
-To use the debug view, complete the following steps:
-
-1. Type the username of a user that exists within any of your LDAP server(s)
-1. Then, press "Run"
-1. If the user is found within any of your LDAP instances, the mapping information is displayed.
-
-Note that this does not work if you are using the single bind configuration outlined below.
-
-{{< figure src="/static/img/docs/ldap_debug_mapping_testing.png" class="docs-image--no-shadow" max-width="600px" alt="LDAP mapping displayed" >}}
-
-[Grafana Enterprise](../../../../introduction/grafana-enterprise/) users with [enhanced LDAP integration](../enhanced-ldap/) enabled can also see sync status in the debug view. This requires the `ldap.status:read` permission.
-
-{{< figure src="/static/img/docs/ldap_sync_debug.png" class="docs-image--no-shadow" max-width="600px" alt="LDAP sync status" >}}
-
### Bind and bind password
By default the configuration expects you to specify a bind DN and bind password. This should be a read only user that can perform LDAP searches.
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 3a90f19b371..8166760890f 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
@@ -30,7 +30,6 @@ To follow this guide, ensure you have permissions in your Okta workspace to crea
1. For **Sign-in method**, select **OIDC - OpenID Connect**.
1. For **Application type**, select **Web Application** and click **Next**.
1. Configure **New Web App Integration Operations**:
-
- **App integration name**: Choose a name for the app.
- **Logo (optional)**: Add a logo.
- **Grant type**: Select **Authorization Code** and **Refresh Token**.
@@ -54,7 +53,6 @@ To follow this guide, ensure you have permissions in your Okta workspace to crea
1. In the **Okta Admin Console**, select **Directory > Profile Editor**.
1. Select the Okta Application Profile you created previously (the default name for this is ` User`).
1. Select **Add Attribute** and fill in the following fields:
-
- **Data Type**: string
- **Display Name**: Meaningful name. For example, `Grafana Role`.
- **Variable Name**: Meaningful name. For example, `grafana_role`.
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 6dd7f45042d..40cfc2441d8 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
@@ -50,7 +50,6 @@ Configuration in the API takes precedence over the configuration in the Grafana
Grafana supports the following SAML 2.0 bindings:
- From the Service Provider (SP) to the Identity Provider (IdP):
-
- `HTTP-POST` binding
- `HTTP-Redirect` binding
@@ -181,12 +180,10 @@ By default, new Grafana users using SAML authentication will have an account cre
If you are also using SCIM provisioning for this Grafana application in Azure AD, it's crucial to align the user identifiers between SAML and SCIM for seamless operation. The unique identifier that links the SAML user to the SCIM provisioned user is determined by the `assertion_attribute_external_uid` setting in the Grafana SAML configuration. This `assertion_attribute_external_uid` should correspond to the `externalId` used in SCIM provisioning (typically set to the Azure AD `user.objectid`).
1. **Ensure Consistent Identifier in SAML Assertion:**
-
- The unique identifier from Azure AD (typically `user.objectid`) that you mapped to the `externalId` attribute in Grafana in your SCIM provisioning setup **must also be sent as a claim in the SAML assertion.** For more details on SCIM, refer to the [SCIM provisioning documentation](/docs/grafana//setup-grafana/configure-security/configure-scim-provisioning/).
- In the Azure AD Enterprise Application, under **Single sign-on** > **Attributes & Claims**, ensure you add a claim that provides this identifier. For example, you might add a claim named `UserID` (or similar, like `externalId`) that sources its value from `user.objectid`.
2. **Configure Grafana SAML Settings for SCIM:**
-
- In the `[auth.saml]` section of your Grafana configuration, set `assertion_attribute_external_uid` to the name of the SAML claim you configured in the previous step (e.g., `userUID` or the full URI like `http://schemas.microsoft.com/identity/claims/objectidentifier` if that's how Azure AD sends it).
- The `assertion_attribute_login` setting should still be configured to map to the attribute your users will log in with (e.g., `userPrincipalName`, `mail`).
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/saml/configure-saml-with-okta/_index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/saml/configure-saml-with-okta/_index.md
index 123a1298385..bb16de2b0ee 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/saml/configure-saml-with-okta/_index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/saml/configure-saml-with-okta/_index.md
@@ -28,7 +28,6 @@ Grafana supports user authentication through Okta, which is useful when you want
1. Click **Create**.
1. On the **General Settings** tab, enter a name for your Grafana integration. You can also upload a logo.
1. On the **Configure SAML** tab, enter the SAML information related to your Grafana instance:
-
- In the **Single sign on URL** field, use the `/saml/acs` endpoint URL of your Grafana instance, for example, `https://grafana.example.com/saml/acs`.
- In the **Audience URI (SP Entity ID)** field, use the `/saml/metadata` endpoint URL, by default it is the `/saml/metadata` endpoint of your Grafana instance (for example `https://example.grafana.com/saml/metadata`). This could be configured differently, but the value here must match the `entity_id` setting of the SAML settings of Grafana.
- Leave the default values for **Name ID format** and **Application username**.
diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/saml/saml-ui/_index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/saml/saml-ui/_index.md
index 7836a46df9f..52d2c84fbfd 100644
--- a/docs/sources/setup-grafana/configure-security/configure-authentication/saml/saml-ui/_index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-authentication/saml/saml-ui/_index.md
@@ -64,7 +64,6 @@ Sign in to Grafana and navigate to **Administration > Authentication > Configure
### 2. Sign Requests Section
1. In the **Sign requests** field, specify whether you want the outgoing requests to be signed, and, if so, then:
-
1. Provide a certificate and a private key that will be used by the service provider (Grafana) and the SAML IdP.
Use the [PKCS #8](https://en.wikipedia.org/wiki/PKCS_8) format to issue the private key.
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 d081a085cb6..3b83e927616 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
@@ -33,7 +33,6 @@ You can use an encryption key from AWS Key Management Service to encrypt secrets
a. Add a new section to the configuration file, with a name in the format of `[security.encryption.awskms.]`, where `` is any name that uniquely identifies this key among other provider keys.
b. Fill in the section with the following values:
-
- `key_id`: a reference to a key stored in the KMS. This can be a key ID, a key Amazon Resource Name (ARN), an alias name, or an alias ARN. If you are using an alias, use the prefix `alias/`. To specify a KMS key in a different AWS account, use its ARN or alias. For more information about how to retrieve a key ID from AWS, refer to [Finding the key ID and key ARN](https://docs.aws.amazon.com/kms/latest/developerguide/find-cmk-id-arn.html).
| `key_id` option | Example value |
| --- | --- |
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 a13d6f7b41e..2b1a959c75b 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
@@ -35,7 +35,6 @@ You can use an encryption key from Azure Key Vault to encrypt secrets in the Gra
a. Add a new section to the configuration file, with a name in the format of `[security.encryption.azurekv.]`, where `` is any name that uniquely identifies this key among other provider keys.
b. Fill in the section with the following values:
-
- `tenant_id`: the **Directory ID** (tenant) from the application that you registered.
- `client_id`: the **Application ID** (client) from the application that you registered.
- `client_secret`: the VALUE of the secret that you generated in your app. (Don't use the Secret ID).
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 3d90697e310..4691ab90674 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
@@ -33,7 +33,6 @@ You can use an encryption key from Google Cloud Key Management Service to encryp
a. Add a new section to the configuration file, with a name in the format of `[security.encryption.azurekv.]`, where `` is any name that uniquely identifies this key among other provider keys.
b. Fill in the section with the following values:
-
- `key_id`: encryption key ID, refer to [Getting the ID for a Key](https://cloud.google.com/kms/docs/getting-resource-ids#getting_the_id_for_a_key_and_version).
- `credentials_file`: full path to service account key JSON file on your computer.
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 e15a46679b0..feee0cda4fb 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
@@ -31,7 +31,6 @@ You can use an encryption key from Hashicorp Vault to encrypt secrets in the Gra
a. Add a new section to the configuration file, with a name in the format of `[security.encryption.hashicorpvault.]`, where `` is any name that uniquely identifies this key among other provider keys.
b. Fill in the section with the following values:
-
- `token`: a periodic service token used to authenticate within Hashicorp Vault.
- `url`: URL of the Hashicorp Vault server.
- `transit_engine_path`: mount point of the transit engine.
diff --git a/docs/sources/setup-grafana/configure-security/configure-scim-provisioning/_index.md b/docs/sources/setup-grafana/configure-security/configure-scim-provisioning/_index.md
index afc7cb26c40..d3c2496f75b 100644
--- a/docs/sources/setup-grafana/configure-security/configure-scim-provisioning/_index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-scim-provisioning/_index.md
@@ -50,7 +50,7 @@ Always verify that your SAML identity provider is configured to send a stable, u
## Benefits
{{< admonition type="note" >}}
-SCIM provisioning only works SAML authentication.
+SCIM provisioning only works with SAML authentication.
Other authentication methods aren't supported.
{{< /admonition >}}
@@ -67,27 +67,19 @@ When you enable SCIM in Grafana, the following requirements and restrictions app
1. **Use the same identity provider for user provisioning and for authentication flow**: You must use the same identity provider for both authentication and user provisioning.
-2. **Authentication restrictions**:
-
- - Users attempting to log in through other methods (LDAP, OAuth) will be blocked
- - By default, users who are not provisioned through SCIM cannot access Grafana
-
-3. **Security restriction**: When using SAML, the login authentication flow requires the SAML assertion exchange between the Identity Provider and Grafana to include the `userUID` SAML assertion with the user's unique identifier at the Identity Provider.
-
+2. **Security restriction**: When using SAML, the login authentication flow requires the SAML assertion exchange between the Identity Provider and Grafana to include the `userUID` SAML assertion with the user's unique identifier at the Identity Provider.
- Configure `userUID` SAML assertion in [Azure AD](/docs/grafana//setup-grafana/configure-security/configure-authentication/saml/configure-saml-with-azuread/#configure-saml-assertions-when-using-scim-provisioning)
- Configure `userUID` SAML assertion in [Okta](/docs/grafana//setup-grafana/configure-security/configure-authentication/saml/configure-saml-with-okta/#configure-saml-assertions-when-using-scim-provisioning)
-4. **Exceptions**: Users with Basic Auth credentials and those using their Grafana Cloud accounts can still log in regardless of these restrictions.
-
## Configure SCIM in Grafana
The table below describes all SCIM configuration options. Like any other Grafana configuration, you can apply these options as [environment variables](/docs/grafana//setup-grafana/configure-grafana/#override-configuration-with-environment-variables).
-| Setting | Required | Description | Default |
-| ----------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------- |
-| `user_sync_enabled` | Yes | Enable SCIM user provisioning. When enabled, Grafana will create, update, and deactivate users based on SCIM requests from your identity provider. | `false` |
-| `group_sync_enabled` | No | Enable SCIM group provisioning. When enabled, Grafana will create, update, and delete teams based on SCIM requests from your identity provider. Cannot be enabled if Team Sync is enabled. | `false` |
-| `allow_non_provisioned_users` | No | Allow non SCIM provisioned users to sign in to Grafana. | `false` |
+| Setting | Required | Description | Default |
+| ------------------------------ | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------- |
+| `user_sync_enabled` | Yes | Enable SCIM user provisioning. When enabled, Grafana will create, update, and deactivate users based on SCIM requests from your identity provider. | `false` |
+| `group_sync_enabled` | No | Enable SCIM group provisioning. When enabled, Grafana will create, update, and delete teams based on SCIM requests from your identity provider. Cannot be enabled if Team Sync is enabled. | `false` |
+| `reject_non_provisioned_users` | No | When enabled, prevents non-SCIM provisioned users from signing in. Cloud Portal users can always sign in regardless of this setting. | `false` |
{{< admonition type="warning" >}}
**Team Sync Compatibility**:
diff --git a/docs/sources/setup-grafana/configure-security/configure-scim-provisioning/configure-scim-with-azuread/_index.md b/docs/sources/setup-grafana/configure-security/configure-scim-provisioning/configure-scim-with-azuread/_index.md
index fb031c15c10..1554484f45b 100644
--- a/docs/sources/setup-grafana/configure-security/configure-scim-provisioning/configure-scim-with-azuread/_index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-scim-provisioning/configure-scim-with-azuread/_index.md
@@ -112,12 +112,13 @@ After setting the Tenant URL and Secret Token, navigate to the **Mappings** sect
Configure the following required attributes:
-| Azure AD Attribute | Grafana Attribute |
-| ------------------- | ------------------------------ |
-| `userPrincipalName` | `userName` |
-| `mail` | `emails[type eq "work"].value` |
-| `displayName` | `displayName` |
-| `objectId` | `externalId` |
+| Azure AD Attribute | Grafana Attribute |
+| ------------------------------------------------------------- | ------------------------------ |
+| `userPrincipalName` | `userName` |
+| `mail` | `emails[type eq "work"].value` |
+| `displayName` | `displayName` |
+| `objectId` | `externalId` |
+| `Switch([IsSoftDeleted], , "False", "True", "True", "False")` | `active` |
### Enable provisioning
diff --git a/docs/sources/setup-grafana/configure-security/configure-scim-provisioning/manage-users-teams/_index.md b/docs/sources/setup-grafana/configure-security/configure-scim-provisioning/manage-users-teams/_index.md
index 5fb60103ad6..2b3b0524884 100644
--- a/docs/sources/setup-grafana/configure-security/configure-scim-provisioning/manage-users-teams/_index.md
+++ b/docs/sources/setup-grafana/configure-security/configure-scim-provisioning/manage-users-teams/_index.md
@@ -57,15 +57,13 @@ For detailed configuration steps specific to the identity provider, see:
SCIM uses a specific process to establish and maintain user identity between the identity provider and Grafana:
1. **Initial user lookup:**
-
- The administrator configures SCIM at the Identity Provider, defining the **Unique identifier field**
- The identity provider looks up each user in Grafana using this unique identifier field as a filter
- The identity provider expects a single result from Grafana for each user
2. **Identity linking based on lookup results:**
-
- **If there's a single matching result:** The identity provider retrieves the user's unique ID at Grafana, saves it, confirms it can fetch the user's information, and updates the user's information in Grafana
- - **If there are no matching results:** The identity provider attempts to create the user in Grafana. If successful, it retrieves and saves the user's unique ID for future operations. If there's a conflict with an existing user, the identity provider flags the error and Grafana logs the error message
+ - **If there are no matching results:** The identity provider attempts to create the user in Grafana. If successful, it retrieves and saves the user's unique ID for future operations. If a user with the same email address already exists in Grafana, the user is updated and will be managed by SCIM from that point forward.
- The identity provider learns the relationship between the found Grafana user and the Grafana internal ID
- The identity provider updates Grafana with the External ID
- Grafana updates the authentication validations to expect this External ID
@@ -81,10 +79,6 @@ This process ensures secure and consistent user identification across both syste
### Existing Grafana users
-{{< admonition type="note" >}}
-Existing users must be assigned to the Grafana app in the identity provider to maintain access once SCIM is enabled.
-{{< /admonition >}}
-
For users who already exist in the Grafana instance:
- SCIM establishes the relationship through the External ID matching process
@@ -97,12 +91,10 @@ For users who already exist in the Grafana instance:
To prevent conflicts and maintain consistent user management, disable or restrict other provisioning methods when implementing SCIM. This ensures that all new users are created through SCIM and prevents duplicate or conflicting user records.
- SAML Just-in-Time (JIT) provisioning:
-
- Disable `allow_sign_up` in SAML settings to prevent automatic user creation
- Existing JIT-provisioned users will continue to work but should be migrated to SCIM
- Terraform or API provisioning:
-
- Stop creating new users through these methods
- Existing users will continue to work but should be migrated to SCIM
- Consider removing or archiving Terraform user creation resources
@@ -141,31 +133,26 @@ The migration process uses the same [user identification mechanism](#how-scim-id
### Migration steps
1. **Prepare the identity provider:**
-
- Ensure all existing Grafana users have corresponding accounts in your IDP
- Verify that the unique identifier field (e.g., email, username, or object ID) matches between systems
- Configure SCIM application in your IDP but don't assign users yet
2. **Configure SCIM in Grafana:**
-
- Set up SCIM endpoint and authentication as described in [Configure SCIM in Grafana](../../configure-scim-provisioning#configure-scim-in-grafana)
- Enable `user_sync_enabled = true`
- Configure the unique identifier field to match your IDP setup
{{< admonition type="note" >}}
-When `user_sync_enabled = true`, non-provisioned users will be disallowed from logging in, except for `admin` and Grafana.com login.
-
-If you want to allow non-provisioned users to log in, enable the `[auth.scim][allow_non_provisioned_users]` option.
+To restrict login access to only SCIM-provisioned users, enable the `[auth.scim][reject_non_provisioned_users]` option. Cloud Portal users can always sign in regardless of this setting.
```ini
[auth.scim]
-allow_non_provisioned_users = true
+reject_non_provisioned_users = true
```
{{< /admonition >}}
3. **Test the matching mechanism:**
-
- Use the SCIM API to verify that existing users can be found using the unique identifier:
```bash
@@ -176,7 +163,6 @@ allow_non_provisioned_users = true
- This should return exactly one user record for each existing user
4. **Assign users in the IDP:**
-
- Begin assigning existing users to the Grafana application in your IDP
- The SCIM identification process will automatically link existing Grafana users with their IDP identities
- Monitor the process for any conflicts or errors
@@ -290,19 +276,6 @@ Team membership maintenance:
### User provisioning issues
-#### Error: "User already exists in Grafana"
-
-**Cause:** The unique identifier field is not working as expected, causing conflicts during user creation.
-
-**Solution:** Test the unique identifier field to ensure it returns a single, unique user:
-
-```bash
-curl --location 'https://{$GRAFANA_URL}/apis/scim.grafana.app/v0alpha1/namespaces/{$STACK_ID}/Users?filter=userName eq "username@email.com"' \
---header 'Authorization: Bearer glsa_xxxxxxxxxxxxxxxxxxxxxxxx'
-```
-
-The response should return exactly one user. If not, configure a different unique identifier field in your identity provider, or remove the duplicate users from Grafana.
-
#### Error: "invalid namespace"
**Cause:** The SCIM endpoint URL is incorrectly formatted.
diff --git a/docs/sources/setup-grafana/configure-security/configure-team-sync.md b/docs/sources/setup-grafana/configure-security/configure-team-sync.md
index f99de6a6189..268e907908f 100644
--- a/docs/sources/setup-grafana/configure-security/configure-team-sync.md
+++ b/docs/sources/setup-grafana/configure-security/configure-team-sync.md
@@ -51,7 +51,6 @@ If you have already grouped some users into a team, then you can synchronize tha
1. Insert the value of the group you want to sync with. This becomes the Grafana `GroupID`.
Examples:
-
- For LDAP, this is the LDAP distinguished name (DN) of LDAP group you want to synchronize with the team.
- For Auth Proxy, this is the value we receive as part of the custom `Groups` header.
diff --git a/docs/sources/setup-grafana/image-rendering/_index.md b/docs/sources/setup-grafana/image-rendering/_index.md
index 43c45bf19e5..568f2d4e6a9 100644
--- a/docs/sources/setup-grafana/image-rendering/_index.md
+++ b/docs/sources/setup-grafana/image-rendering/_index.md
@@ -59,11 +59,16 @@ You can update your settings by using a configuration file, see [default.json](h
You can volume mount your custom configuration file when starting the docker container:
```bash
-docker run -d --name=renderer --network=host -v /some/path/config.json:/usr/src/app/config.json grafana/grafana-image-renderer:latest
+docker run -d --name=renderer --network=host -v /some/path/config.json:/home/nonroot/config.json grafana/grafana-image-renderer:latest
```
You can see a docker-compose example using a custom configuration file [here](https://github.com/grafana/grafana-image-renderer/tree/master/devenv/docker/custom-config).
+{{< admonition type="note" >}}
+The configuration files were located in `/usr/src/app` up until v4.0.0 and later.
+After this point, they are located in `/home/nonroot`.
+{{< /admonition >}}
+
### Security
{{< admonition type="note" >}}
diff --git a/docs/sources/setup-grafana/image-rendering/troubleshooting/index.md b/docs/sources/setup-grafana/image-rendering/troubleshooting/index.md
index 3c33d01dbc3..61cd711bd50 100644
--- a/docs/sources/setup-grafana/image-rendering/troubleshooting/index.md
+++ b/docs/sources/setup-grafana/image-rendering/troubleshooting/index.md
@@ -61,49 +61,8 @@ ldd chrome-headless-shell/linux-132.0.6781.0/chrome-headless-shell-linux64/chrom
...
```
-**Ubuntu:**
-
-On Ubuntu 18.10 the following dependencies are required for the image rendering to function.
-
-```bash
-libx11-6 libx11-xcb1 libxcomposite1 libxcursor1 libxdamage1 libxext6 libxfixes3 libxi6 libxrender1 libxtst6 libglib2.0-0 libnss3 libcups2 libdbus-1-3 libxss1 libxrandr2 libgtk-3-0 libasound2 libxcb-dri3-0 libgbm1 libxshmfence1
-```
-
-**Debian:**
-
-On Debian 9 (Stretch) the following dependencies are required for the image rendering to function.
-
-```bash
-libx11 libcairo libcairo2 libxtst6 libxcomposite1 libx11-xcb1 libxcursor1 libxdamage1 libnss3 libcups libcups2 libxss libxss1 libxrandr2 libasound2 libatk1.0-0 libatk-bridge2.0-0 libpangocairo-1.0-0 libgtk-3-0 libgbm1 libxshmfence1
-```
-
-On Debian 10 (Buster) the following dependencies are required for the image rendering to function.
-
-```bash
-libxdamage1 libxext6 libxi6 libxtst6 libnss3 libcups2 libxss1 libxrandr2 libasound2 libatk1.0-0 libatk-bridge2.0-0 libpangocairo-1.0-0 libpango-1.0-0 libcairo2 libatspi2.0-0 libgtk3.0-cil libgdk3.0-cil libx11-xcb-dev libgbm1 libxshmfence1
-```
-
-**Centos:**
-
-On a minimal CentOS 7 installation, the following dependencies are required for the image rendering to function:
-
-```bash
-libXcomposite libXdamage libXtst cups libXScrnSaver pango atk adwaita-cursor-theme adwaita-icon-theme at at-spi2-atk at-spi2-core cairo-gobject colord-libs dconf desktop-file-utils ed emacs-filesystem gdk-pixbuf2 glib-networking gnutls gsettings-desktop-schemas gtk-update-icon-cache gtk3 hicolor-icon-theme jasper-libs json-glib libappindicator-gtk3 libdbusmenu libdbusmenu-gtk3 libepoxy liberation-fonts liberation-narrow-fonts liberation-sans-fonts liberation-serif-fonts libgusb libindicator-gtk3 libmodman libproxy libsoup libwayland-cursor libwayland-egl libxkbcommon m4 mailx nettle patch psmisc redhat-lsb-core redhat-lsb-submod-security rest spax time trousers xdg-utils xkeyboard-config alsa-lib
-```
-
-On a minimal CentOS 8 installation, the following dependencies are required for the image rendering to function:
-
-```bash
-libXcomposite libXdamage libXtst cups libXScrnSaver pango atk adwaita-cursor-theme adwaita-icon-theme at at-spi2-atk at-spi2-core cairo-gobject colord-libs dconf desktop-file-utils ed emacs-filesystem gdk-pixbuf2 glib-networking gnutls gsettings-desktop-schemas gtk-update-icon-cache gtk3 hicolor-icon-theme jasper-libs json-glib libappindicator-gtk3 libdbusmenu libdbusmenu-gtk3 libepoxy liberation-fonts liberation-narrow-fonts liberation-sans-fonts liberation-serif-fonts libgusb libindicator-gtk3 libmodman libproxy libsoup libwayland-cursor libwayland-egl libxkbcommon m4 mailx nettle patch psmisc redhat-lsb-core redhat-lsb-submod-security rest spax time trousers xdg-utils xkeyboard-config alsa-lib libX11-xcb
-```
-
-**RHEL:**
-
-On a minimal RHEL 8 installation, the following dependencies are required for the image rendering to function:
-
-```bash
-linux-vdso.so.1 libdl.so.2 libpthread.so.0 libgobject-2.0.so.0 libglib-2.0.so.0 libnss3.so libnssutil3.so libsmime3.so libnspr4.so libatk-1.0.so.0 libatk-bridge-2.0.so.0 libcups.so.2 libgio-2.0.so.0 libdrm.so.2 libdbus-1.so.3 libexpat.so.1 libxcb.so.1 libxkbcommon.so.0 libm.so.6 libX11.so.6 libXcomposite.so.1 libXdamage.so.1 libXext.so.6 libXfixes.so.3 libXrandr.so.2 libgbm.so.1 libpango-1.0.so.0 libcairo.so.2 libasound.so.2 libatspi.so.0 libgcc_s.so.1 libc.so.6 /lib64/ld-linux-x86-64.so.2 libgnutls.so.30 libpcre.so.1 libffi.so.6 libplc4.so libplds4.so librt.so.1 libgmodule-2.0.so.0 libgssapi_krb5.so.2 libkrb5.so.3 libk5crypto.so.3 libcom_err.so.2 libavahi-common.so.3 libavahi-client.so.3 libcrypt.so.1 libz.so.1 libselinux.so.1 libresolv.so.2 libmount.so.1 libsystemd.so.0 libXau.so.6 libXrender.so.1 libthai.so.0 libfribidi.so.0 libpixman-1.so.0 libfontconfig.so.1 libpng16.so.16 libxcb-render.so.0 libidn2.so.0 libunistring.so.2 libtasn1.so.6 libnettle.so.6 libhogweed.so.4 libgmp.so.10 libkrb5support.so.0 libkeyutils.so.1 libpcre2-8.so.0 libuuid.so.1 liblz4.so.1 libgcrypt.so.20 libbz2.so.1
-```
+You can find a reference to all the relevant Debian packages for the service to function [in the Dockerfile](https://github.com/grafana/grafana-image-renderer/blob/master/Dockerfile).
+If you are using an operating system that is not Debian 12, you should look up what each of those packages are called on your system.
## Certificate signed by internal certificate authorities
@@ -127,6 +86,9 @@ If this happens, then you have to add the certificate to the trust store. If you
[root@server ~]# chown -R grafana: /usr/share/grafana/.pki/nssdb
```
+You may also have to use other tooling than `certutil`, such as `update-ca-certificates` and its accompanying paths.
+This depends on the Linux distribution you use; distributions often have a wiki with this type of information.
+
**Windows:**
```
@@ -138,17 +100,30 @@ certutil –addstore "Root" /internal-root-ca.crt.pem
```Dockerfile
FROM grafana/grafana-image-renderer:latest
+# Elevate our permissions to access system resources.
USER root
-RUN apk add --no-cache nss-tools
+RUN mkdir -p /usr/local/share/ca-certificates/
+# Convert from .pem to .crt
+RUN openssl x509 -inform PEM -in rootCA.pem -out /usr/local/share/ca-certificates/rootCA.crt
-USER grafana
+# Regenerate the CA certificates in the container.
+RUN update-ca-certificates --fresh
-COPY internal-root-ca.crt.pem /etc/pki/tls/certs/internal-root-ca.crt.pem
-RUN mkdir -p /home/grafana/.pki/nssdb
-RUN certutil -d sql:/home/grafana/.pki/nssdb -A -n internal-root-ca -t C -i /etc/pki/tls/certs/internal-root-ca.crt.pem
+# Reassume the nonroot user for the service execution.
+USER nonroot
+
+# Some CA certificates also need to explicitly be included in the user's network security services database.
+# certutil is shipped in v4.0.8 and onwards of the image.
+RUN mkdir -p /home/nonroot/.pki/nssdb
+RUN certutil -d sql:/home/nonroot/.pki/nssdb -A -n internal-root-ca -t C -i /usr/local/share/ca-certificates/rootCA.crt
```
+{{< admonition type="note" >}}
+The container image was based on Alpine until v4.0.0.
+After this point, it is based on distroless Debian.
+{{< /admonition >}}
+
## Custom Chrome/Chromium
As a last resort, if you already have [Chrome](https://www.google.com/chrome/) or [Chromium](https://www.chromium.org/)
diff --git a/docs/sources/setup-grafana/installation/helm/index.md b/docs/sources/setup-grafana/installation/helm/index.md
index 9551abe3a44..a77677b4f9b 100644
--- a/docs/sources/setup-grafana/installation/helm/index.md
+++ b/docs/sources/setup-grafana/installation/helm/index.md
@@ -109,7 +109,6 @@ When you create a new namespace in Kubernetes, you can better organize, allocate
```
Where:
-
- `helm install`: Installs the chart by deploying it on the Kubernetes cluster
- `my-grafana`: The logical chart name that you provided
- `grafana/grafana`: The repository and package name to install
@@ -147,7 +146,6 @@ This section describes the steps you must complete to access Grafana via web bro
```
This command will print out the chart notes. You will the output `NOTES` that provide the complete instructions about:
-
- How to decode the login password for the Grafana admin account
- Access Grafana service to the web browser
diff --git a/docs/sources/setup-grafana/installation/kubernetes/index.md b/docs/sources/setup-grafana/installation/kubernetes/index.md
index 7a9cf7fb9a7..0085a670896 100644
--- a/docs/sources/setup-grafana/installation/kubernetes/index.md
+++ b/docs/sources/setup-grafana/installation/kubernetes/index.md
@@ -391,9 +391,7 @@ Instead of using the `annotate` flag, you can still use the `--record` flag. How
1. In the editor, change the container image under the `kind: Deployment` section.
For example:
-
- From
-
- `yaml image: grafana/grafana-oss:10.0.1`
- To
@@ -573,7 +571,6 @@ This section outlines general instructions for provisioning Grafana resources wi
```
You can follow the same process to provision additional Grafana resources by supplying the following folders:
-
- `provisioning/dashboards`
- `provisioning/datasources`
- `provisioning/plugins`
diff --git a/docs/sources/setup-grafana/installation/mac/index.md b/docs/sources/setup-grafana/installation/mac/index.md
index f4c3f5d7342..16a064ab063 100644
--- a/docs/sources/setup-grafana/installation/mac/index.md
+++ b/docs/sources/setup-grafana/installation/mac/index.md
@@ -35,7 +35,6 @@ To install Grafana on macOS using Homebrew, complete the following steps:
```
The brew page downloads and untars the files into:
-
- `/usr/local/Cellar/grafana/[version]` (Intel Silicon)
- `/opt/homebrew/Cellar/grafana/[version]` (Apple Silicon)
diff --git a/docs/sources/setup-grafana/set-up-https.md b/docs/sources/setup-grafana/set-up-https.md
index b9823b47f2a..00c8838be94 100644
--- a/docs/sources/setup-grafana/set-up-https.md
+++ b/docs/sources/setup-grafana/set-up-https.md
@@ -131,7 +131,6 @@ The instructions provided in this section are for a Debian-based Linux system. F
```
These commands:
-
- Uninstall `certbot` from your system if it has been installed using a package manager
- Install `certbot` using `snapd`
diff --git a/docs/sources/shared/datasources/datasouce-authentication.md b/docs/sources/shared/datasources/datasouce-authentication.md
index 4582eb48593..cb51a39774a 100644
--- a/docs/sources/shared/datasources/datasouce-authentication.md
+++ b/docs/sources/shared/datasources/datasouce-authentication.md
@@ -18,7 +18,6 @@ labels:
To set up authentication:
1. Select an authentication method from the drop-down list:
-
- **Basic authentication**: Authenticates your data source using a username and password
- **Forward OAuth identity**: Forwards the OAuth access token and the OIDC ID token, if available, of the user querying to the data source
- **No authentication**: No authentication is required to access the data source
diff --git a/docs/sources/shared/upgrade/upgrade-common-tasks.md b/docs/sources/shared/upgrade/upgrade-common-tasks.md
index e6a252d43e4..0667dca09e6 100644
--- a/docs/sources/shared/upgrade/upgrade-common-tasks.md
+++ b/docs/sources/shared/upgrade/upgrade-common-tasks.md
@@ -66,7 +66,6 @@ To upgrade Grafana installed using RPM or YUM complete the following steps:
This enables you to upgrade Grafana without the risk of losing your configuration changes.
1. Perform one of the following steps based on your installation.
-
- If you [downloaded an RPM package](https://grafana.com/grafana/download) to install Grafana, then complete the steps documented in [Install Grafana on Red Hat, RHEL, or Fedora](https://grafana.com/docs/grafana//setup-grafana/installation/redhat-rhel-fedora/) or [Install Grafana on SUSE or openSUSE](https://grafana.com/docs/grafana///setup-grafana/installation/suse-opensuse/) to upgrade Grafana.
- If you used the Grafana YUM repository, run the following command:
diff --git a/docs/sources/shared/visualizations/cell-options.md b/docs/sources/shared/visualizations/cell-options.md
new file mode 100644
index 00000000000..03c0e4a76dc
--- /dev/null
+++ b/docs/sources/shared/visualizations/cell-options.md
@@ -0,0 +1,10 @@
+---
+title: Cell options
+---
+
+
+| Option | Description |
+| ------ | ----------- |
+| Wrap text |
Toggle the **Wrap text** switch to wrap text in the cell that contains the longest content in your table. To wrap the text _in a specific column only_, use a **Fields with name** [field override](https://grafana.com/docs/grafana//panels-visualizations/configure-overrides/), select the **Cell options > Cell type** override property, and toggle on the **Wrap text** switch.
Text wrapping is in [public preview](https://grafana.com/docs/release-life-cycle/#public-preview), however, it’s available to use by default.
|
+| Cell value inspect |
Enables value inspection from table cells. When the switch is toggled on, clicking the inspect icon in a cell opens the **Inspect value** drawer which contains two tabs: **Plain text** and **Code editor**.
Grafana attempts to automatically detect the type of data in the cell and opens the drawer with the associated tab showing. However, you can switch back and forth between tabs.
|
+
diff --git a/docs/sources/tutorials/alerting-get-started-pt2/index.md b/docs/sources/tutorials/alerting-get-started-pt2/index.md
index b64564ec74e..ff2b8ab2487 100644
--- a/docs/sources/tutorials/alerting-get-started-pt2/index.md
+++ b/docs/sources/tutorials/alerting-get-started-pt2/index.md
@@ -25,6 +25,8 @@ This tutorial is a continuation of the [Grafana Alerting - Create and receive yo
In this guide, we dig into more complex yet equally fundamental elements of Grafana Alerting: **alert instances** and **notification policies**.
+{{< youtube id="nI-_MEnFBQs" >}}
+
After introducing each component, you will learn how to:
- Configure an alert rule that returns more than one alert instance
@@ -49,17 +51,14 @@ Learning about alert instances and notification policies is useful if you have m
There are different ways you can follow along with this tutorial.
- **Grafana Cloud**
-
- As a Grafana Cloud user, you don't have to install anything. [Create your free account](http://www.grafana.com/auth/sign-up/create-user).
Continue to [Alert instances](#alert-instances).
- **Interactive learning environment**
-
- Alternatively, you can try out this example in our interactive learning environment: [Get started with Grafana Alerting - Alert routing](https://killercoda.com/grafana-labs/course/grafana/alerting-get-started-pt2/). It's a fully configured environment with all the dependencies already installed.
- **Grafana OSS**
-
- If you opt to run a Grafana stack locally, ensure you have the following applications installed:
- [Docker Compose](https://docs.docker.com/get-docker/) (included in Docker for Desktop for macOS and Windows)
@@ -250,7 +249,6 @@ Grafana includes a [test data source](https://grafana.com/docs/grafana/latest/da
The above CSV data simulates a data source returning multiple time series, each leading to the creation of an alert instance for that specific time series. Note that the data returned matches the example in the [Alert instance](#alert-instances) section.
1. In the **Alert condition** section:
-
- Keep `Last` as the value for the reducer function (`WHEN`), and `IS ABOVE 1000` as the threshold value. This is the value above which the alert rule should trigger.
1. Click **Preview alert rule condition** to run the queries.
diff --git a/docs/sources/tutorials/alerting-get-started-pt3/index.md b/docs/sources/tutorials/alerting-get-started-pt3/index.md
index fa7aa1c55d7..20141eee062 100644
--- a/docs/sources/tutorials/alerting-get-started-pt3/index.md
+++ b/docs/sources/tutorials/alerting-get-started-pt3/index.md
@@ -39,6 +39,8 @@ refs:
This tutorial is a continuation of the [Get started with Grafana Alerting - Alert routing](http://www.grafana.com/tutorials/alerting-get-started-pt2/) tutorial.
+{{< youtube id="WZ8gqKIQ5Oc" >}}
+
Grouping in Grafana Alerting reduces notification noise by combining related alert instances into a single, concise notification. This is useful for on-call engineers, ensuring they focus on resolving incidents instead of sorting through a flood of notifications.
Grouping is configured using labels in the notification policy. These labels reference those generated by alert instances or configured by the user.
@@ -68,17 +70,14 @@ In this tutorial, you will:
There are different ways you can follow along with this tutorial.
- **Grafana Cloud**
-
- As a Grafana Cloud user, you don't have to install anything. [Create your free account](http://www.grafana.com/auth/sign-up/create-user).
Continue to [How alert rule grouping works](#how-alert-rule-grouping-works).
- **Interactive learning environment**
-
- Alternatively, you can try out this example in our interactive learning environment: [Get started with Grafana Alerting - Grouping](https://killercoda.com/grafana-labs/course/grafana/alerting-get-started-pt3/). It's a fully configured environment with all the dependencies already installed.
- **Grafana OSS**
-
- If you opt to run a Grafana stack locally, ensure you have the following applications installed:
- [Docker Compose](https://docs.docker.com/get-docker/) (included in Docker for Desktop for macOS and Windows)
@@ -227,16 +226,13 @@ Following the above example, [notification policies](ref:notification-policies)
1. Sign in to Grafana:
-
- **Grafana Cloud** users: Log in via Grafana Cloud.
- **OSS users**: Go to [http://localhost:3000](http://localhost:3000).
1. Navigate to **Notification Policies**:
-
- Go to **Alerts & IRM > Alerting > Notification Policies**.
1. Add a child policy:
-
- In the Default policy, click **+ New child policy**.
- **Label**: `region`
- **Operator**: `=`
@@ -245,31 +241,26 @@ Following the above example, [notification policies](ref:notification-policies)
This label matches alert rules where the region label is us-west.
1. Choose a **Contact point**:
-
- Select **Webhook**.
If you don’t have any contact points, add a [Contact point](https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/#add-a-contact-point).
1. Enable Continue matching:
-
- Turn on **Continue matching subsequent sibling nodes** so the evaluation continues even after one or more labels (i.e. region label) match.
1. Override grouping settings:
-
- Toggle **Override grouping**.
- **Group by**: Add `region` as label. Remove any existing labels.
**Group by** consolidates alerts that share the same grouping label into a single notification. For example, all alerts with `region=us-west` will be combined into one notification, making it easier to manage and reducing alert fatigue.
1. Set custom timing:
-
- Toggle **Override general timings**.
- **Group interval**: `2m`. This ensures follow-up notifications for the same alert group will be sent at intervals of 2 minutes. While the default is 5 minutes, we chose 2 minutes here to provide faster feedback for demonstration purposes.
**Timing options** control how often notifications are sent and can help balance timely alerting with minimizing noise.
1. Save and repeat:
-
- Repeat the steps above for `region = us-east` but without overriding grouping and timing options. Use a different webhook endpoint as the contact point.
{{< figure src="/media/docs/alerting/notificaiton-policies-region.png" max-width="750px" alt="Two nested notification policies to route and group alert notifications" >}}
@@ -290,7 +281,6 @@ Following the above example, [notification policies](ref:notification-policies)
1. Visit [http://localhost:3000](http://localhost:3000), where Grafana should be running
1. Navigate to **Alerts & IRM > Alerting > Notification policies**.
1. In the Default policy, click **+ New child policy**.
-
- In the Default policy, click **+ New child policy**.
- **Label**: `region`
- **Operator**: `=`
@@ -299,31 +289,26 @@ Following the above example, [notification policies](ref:notification-policies)
This label matches alert rules where the region label is us-west
1. Choose a **Contact point**:
-
- Select **Webhook**.
If you don’t have any contact points, add a Contact point.
1. Enable Continue matching:
-
- Turn on **Continue matching subsequent sibling nodes** so the evaluation continues even after one or more labels (i.e. region label) match.
1. Override grouping settings:
-
- Toggle **Override grouping**.
- **Group by**: `region`.
**Group by** consolidates alerts that share the same grouping label into a single notification. For example, all alerts with `region=us-west` will be combined into one notification, making it easier to manage and reducing alert fatigue.
1. Set custom timing:
-
- Toggle **Override general timings**.
- **Group interval**: `2m`. This ensures follow-up notifications for the same alert group will be sent at intervals of 2 minutes. While the default is 5 minutes, we chose 2 minutes here to provide faster feedback for demonstration purposes.
**Timing options** control how often notifications are sent and can help balance timely alerting with minimizing noise.
1. Save and repeat:
-
- Repeat for `region = us-east` with a different webhook or a different contact point.
**Note**: Label matchers are combined using the `AND` logical operator. This means that all matchers must be satisfied for a rule to be linked to a policy. If you attempt to use the same label key (e.g., region) with different values (e.g., us-west and us-east), the condition will not match, because it is logically impossible for a single key to have multiple values simultaneously.
@@ -355,7 +340,6 @@ Grafana includes a [test data source](https://grafana.com/docs/grafana/latest/da
1. From the drop-down menu, select **TestData** data source.
1. From **Scenario** select **CSV Content**.
1. Copy in the following CSV data:
-
- Select **TestData** as the data source.
- Set **Scenario** to **CSV Content**.
- Use the following CSV data:
@@ -375,7 +359,6 @@ Grafana includes a [test data source](https://grafana.com/docs/grafana/latest/da
The returned data simulates a data source returning multiple time series, each leading to the creation of an alert instance for that specific time series.
1. In the **Alert condition** section:
-
- Keep `Last` as the value for the reducer function (`WHEN`), and `IS ABOVE 75` as the threshold value. This is the value above which the alert rule should trigger.
1. Click **Preview alert rule condition** to run the queries.
diff --git a/docs/sources/tutorials/alerting-get-started-pt4/index.md b/docs/sources/tutorials/alerting-get-started-pt4/index.md
index ce34258da51..5fe4d1afbff 100644
--- a/docs/sources/tutorials/alerting-get-started-pt4/index.md
+++ b/docs/sources/tutorials/alerting-get-started-pt4/index.md
@@ -100,17 +100,14 @@ There are different ways you can follow along with this tutorial.
> Note: Some of the templating features in Grafana Alerting discussed in this tutorial are currently available in Grafana Cloud but have not yet been released to the Open Source (OSS) version.
- **Grafana Cloud**
-
- As a Grafana Cloud user, you don't have to install anything. [Create your free account](http://www.grafana.com/auth/sign-up/create-user).
Continue to [how templating works](#how-templating-works).
- **Interactive learning environment**
-
- Alternatively, you can try out this example in our interactive learning environment: [Get started with Grafana Alerting - Templating](https://killercoda.com/grafana-labs/course/grafana/alerting-get-started-pt4/). It's a fully configured environment with all the dependencies already installed.
- **Grafana OSS**
-
- If you opt to run a Grafana stack locally, ensure you have the following applications installed:
- [Docker Compose](https://docs.docker.com/get-docker/) (included in Docker for Desktop for macOS and Windows)
@@ -215,7 +212,6 @@ Now that we've introduced how templating works, let’s move on to the next step
### Create an alert rule
1. Sign in to Grafana:
-
- **Grafana Cloud** users: Log in via Grafana Cloud.
- **OSS users**: Go to [http://localhost:3000](http://localhost:3000).
@@ -224,7 +220,6 @@ Now that we've introduced how templating works, let’s move on to the next step
- Click **+ New alert rule**.
- Enter an **alert rule name**. Name it `High CPU usage`
1. **Define query an alert condition** section:
-
- Select TestData data source from the drop-down menu.
[TestData](https://grafana.com/docs/grafana/latest/datasources/testdata/) is included in the demo environment. If you’re working in Grafana Cloud or your own local Grafana instance, you can add the data source through the Connections menu.
@@ -243,7 +238,6 @@ Now that we've introduced how templating works, let’s move on to the next step
This dataset simulates a data source returning multiple time series, with each time series generating a separate alert instance.
1. **Alert condition** section:
-
- Keep Last as the value for the reducer function (`WHEN`), and `IS ABOVE 75` as the threshold value, representing CPU usage above 75% .This is the value above which the alert rule should trigger.
- Click **Preview alert rule condition** to run the queries.
@@ -252,7 +246,6 @@ Now that we've introduced how templating works, let’s move on to the next step
{{< figure src="/media/docs/alerting/part-4-firing-instances-preview.png" max-width="1200px" caption="Preview of a query returning alert instances" >}}
1. Add folders and labels section:
-
- In **Folder**, click **+ New folder** and enter a name. For example: `System metrics` . This folder contains our alert rules.
Note: while it's possible to template labels here, in this tutorial, we focus on templating the summary and annotations fields instead.
@@ -265,13 +258,11 @@ Now that we've introduced how templating works, let’s move on to the next step
1. **Configure notifications** section:
Select who should receive a notification when an alert rule fires.
-
- Select a **Contact point**. If you don’t have any contact points, click _View or create contact points_.
1. **Configure notification message** section:
In this step, you’ll configure the **summary** and **description** annotations to make your alert notifications informative and easy to understand. These annotations use templates to dynamically include key information about the alert.
-
- **Summary** annotation: Enter the following code as the value for the annotation.:
```go
@@ -412,7 +403,6 @@ In this tutorial, we learned how to use templating in Grafana Alerting to create
To deepen your understanding of Grafana’s templating, explore the following resources:
- **Overview of the functions and operators used in templates**:
-
- [Notification template language](https://grafana.com/docs/grafana/latest/alerting/configure-notifications/template-notifications/language/)
- [Alert rule template language](https://grafana.com/docs/grafana/latest/alerting/alerting-rules/templates/language/)
diff --git a/docs/sources/tutorials/alerting-get-started-pt5/index.md b/docs/sources/tutorials/alerting-get-started-pt5/index.md
index 91a1c1e4141..fe89a2a3b18 100644
--- a/docs/sources/tutorials/alerting-get-started-pt5/index.md
+++ b/docs/sources/tutorials/alerting-get-started-pt5/index.md
@@ -37,7 +37,6 @@ In this tutorial you will learn how to:
## Before you begin
- **Interactive learning environment**
-
- Alternatively, you can [try out this example in our interactive learning environment](https://killercoda.com/grafana-labs/course/grafana/alerting-get-started-pt5/). It’s a fully configured environment with all the dependencies already installed.
- **Grafana OSS**
@@ -174,14 +173,12 @@ Notification policies route alert instances to contact points via label matchers
Although our application doesn't explicitly include an `environment` label, we can rely on other labels like `instance` or `deployment`, which may contain keywords (like prod or staging) that indicate the environment.
1. Sign in to Grafana:
-
- **Grafana Cloud** users: Log in via Grafana Cloud.
- **OSS users**: Go to [http://localhost:3000](http://localhost:3000).
1. Navigate to **Alerts & IRM > Alerting > Notification Policies**.
1. Add a child policy:
-
- In the **Default policy**, click **+ New child policy**.
- **Label**: `environment`.
- **Operator**: `=`.
@@ -189,17 +186,14 @@ Although our application doesn't explicitly include an `environment` label, we c
- This label matches alert rules where the environment label is `prod`.
1. Choose a **contact point**:
-
- If you don’t have any contact points, add a [Contact point](https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/#add-a-contact-point).
For a quick test, you can use a public webhook from [webhook.site](https://webhook.site/) to capture and inspect alert notifications. If you choose this method, select **Webhook** from the drop-down menu in contact points.
1. Enable continue matching:
-
- Turn on **Continue matching subsequent sibling nodes** so the evaluation continues even after one or more labels (i.e., _environment_ labels) match.
1. Save and repeat
-
- Create another child policy by following the same steps.
- Use `environment = staging` as the label/value pair.
- Feel free to use a different contact point.
@@ -234,7 +228,6 @@ Make it short and descriptive, as this will appear in your alert notification. F
```
1. **Alert condition** section:
-
- Enter `75` as the value for **WHEN QUERY IS ABOVE** to set the threshold for the alert.
- Click **Preview alert rule condition** to run the queries.
diff --git a/docs/sources/tutorials/alerting-get-started-pt6/index.md b/docs/sources/tutorials/alerting-get-started-pt6/index.md
index 8f4b3eeff83..470330237e2 100644
--- a/docs/sources/tutorials/alerting-get-started-pt6/index.md
+++ b/docs/sources/tutorials/alerting-get-started-pt6/index.md
@@ -39,7 +39,6 @@ In this tutorial you will learn how to:
## Before you begin
- **Interactive learning environment**
-
- Alternatively, you can [try out this example in our interactive learning environment](https://killercoda.com/grafana-labs/course/grafana/alerting-get-started-pt6/). It’s a fully configured environment with all the dependencies already installed.
- **Grafana OSS**
@@ -150,12 +149,10 @@ To keep track of these metrics you can set up a visualization for CPU usage and
The time-series visualization supports alert rules to provide more context in the form of annotations and alert rule state. Follow these steps to create a visualization to monitor the application’s metrics.
1. Log in to Grafana:
-
- Navigate to [http://localhost:3000](http://localhost:3000), where Grafana should be running.
- Username and password: `admin`
1. Create a time series panel:
-
- Navigate to **Dashboards**.
- Click **+ Create dashboard**.
- Click **+ Add visualization**.
@@ -163,7 +160,6 @@ The time-series visualization supports alert rules to provide more context in th
- Enter a title for your panel, e.g., **CPU and Memory Usage**.
1. Add queries for metrics:
-
- In the query area, copy and paste the following PromQL query:
** switch to **Code** mode if not already selected **
@@ -177,7 +173,6 @@ The time-series visualization supports alert rules to provide more context in th
This query should display the simulated CPU usage data for the **prod** environment.
1. Add memory usage query:
-
- Click **+ Add query**.
- In the query area, paste the following PromQL query:
@@ -219,7 +214,6 @@ Make it short and descriptive, as this will appear in your alert notification. F
```
1. **Alert condition**
-
- Enter 75 as the value for **WHEN QUERY IS ABOVE** to set the threshold for the alert.
- Click **Preview alert rule condition** to run the queries.
diff --git a/docs/sources/tutorials/alerting-get-started/index.md b/docs/sources/tutorials/alerting-get-started/index.md
index 542190188f1..69107963b35 100644
--- a/docs/sources/tutorials/alerting-get-started/index.md
+++ b/docs/sources/tutorials/alerting-get-started/index.md
@@ -57,17 +57,14 @@ After you have completed Part 1, don’t forget to explore the advanced but esse
There are different ways you can follow along with this tutorial.
- **Grafana Cloud**
-
- As a Grafana Cloud user, you don't have to install anything. [Create your free account](http://www.grafana.com/auth/sign-up/create-user).
Continue to [Create a contact point](#create-a-contact-point).
- **Interactive learning environment**
-
- Alternatively, you can [try out this example in our interactive learning environment](https://killercoda.com/grafana-labs/course/grafana/alerting-get-started/). It's a fully configured environment with all the dependencies already installed.
- **Grafana OSS**
-
- If you opt to run a Grafana stack locally, ensure you have the following applications installed:
- [Docker Compose](https://docs.docker.com/get-docker/) (included in Docker for Desktop for macOS and Windows)
@@ -194,7 +191,6 @@ Grafana includes a [test data source](https://grafana.com/docs/grafana/latest/da
1. Select the **TestData** data source from the drop-down menu.
1. In the **Alert condition** section:
-
- Keep **Random Walk** as the _Scenario_.
- Keep `Last` as the value for the reducer function (`WHEN`), and `IS ABOVE 0` as the threshold value. This is the value above which the alert rule should trigger.
diff --git a/docs/sources/tutorials/create-alerts-with-logs/index.md b/docs/sources/tutorials/create-alerts-with-logs/index.md
index 873a2e7094f..aa5ee2eaade 100644
--- a/docs/sources/tutorials/create-alerts-with-logs/index.md
+++ b/docs/sources/tutorials/create-alerts-with-logs/index.md
@@ -65,12 +65,10 @@ There are different ways you can follow along with this tutorial.
- **Grafana OSS**
To run a Grafana stack locally, ensure you have the following applications installed:
-
- [Docker Compose](https://docs.docker.com/get-docker/) (included in Docker for Desktop for macOS and Windows)
- [Git](https://git-scm.com/)
- **Interactive learning environment**
-
- Alternatively, you can [try out this example in our interactive learning environment](https://killercoda.com/grafana-labs/course/grafana/alerting-loki-logs). It's a fully configured environment with all the dependencies already installed.
## Set up the Grafana stack
@@ -227,7 +225,6 @@ In this section, we use the default options for Grafana-managed alert rule creat
{{< /docs/ignore >}}
1. In the **Alert condition** section:
-
- Keep `Last` as the value for the reducer function (`WHEN`), and `0` as the threshold value. This is the value above which the alert rule should trigger.
1. Click **Preview alert rule condition** to run the query.
diff --git a/docs/sources/tutorials/grafana-fundamentals/index.md b/docs/sources/tutorials/grafana-fundamentals/index.md
index 20f9616fea8..0b8ef024707 100644
--- a/docs/sources/tutorials/grafana-fundamentals/index.md
+++ b/docs/sources/tutorials/grafana-fundamentals/index.md
@@ -375,7 +375,6 @@ The most basic alert rule consists of two parts:
> {{< /docs/ignore >}}
Some popular channels include:
-
- [Email](https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/integrations/configure-email/)
- [Webhooks](https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/integrations/webhook-notifier/)
- [Telegram](https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/integrations/configure-telegram/)
diff --git a/docs/sources/upgrade-guide/upgrade-v12.1/index.md b/docs/sources/upgrade-guide/upgrade-v12.1/index.md
new file mode 100644
index 00000000000..74095298c90
--- /dev/null
+++ b/docs/sources/upgrade-guide/upgrade-v12.1/index.md
@@ -0,0 +1,22 @@
+---
+description: Guide for upgrading to Grafana v12.1
+keywords:
+ - grafana
+ - configuration
+ - documentation
+ - upgrade
+ - '12.1'
+title: Upgrade to Grafana v12.1
+menuTitle: Upgrade to v12.1
+weight: 499
+---
+
+# Upgrade to Grafana v12.1
+
+{{< docs/shared lookup="upgrade/intro_2.md" source="grafana" version="" >}}
+
+{{< docs/shared lookup="back-up/back-up-grafana.md" source="grafana" version="" leveloffset="+1" >}}
+
+{{< docs/shared lookup="upgrade/upgrade-common-tasks.md" source="grafana" version="" >}}
+
+## Technical notes
diff --git a/docs/sources/upgrade-guide/when-to-upgrade/index.md b/docs/sources/upgrade-guide/when-to-upgrade/index.md
index bd0ac788b43..6467fb25ded 100644
--- a/docs/sources/upgrade-guide/when-to-upgrade/index.md
+++ b/docs/sources/upgrade-guide/when-to-upgrade/index.md
@@ -46,7 +46,7 @@ We provide release documentation in multiple places to address different needs:
## When to expect releases
-Currently, Grafana is on a monthly release cycle. Here’s a look at scheduled releases for 2025:
+Grafana currently follows a monthly release schedule. Below are the planned releases for 2025, though these dates may be subject to change:
| **Release date** | **Grafana versions** | **Release type** |
| ---------------- | ------------------------- | ---------------- |
@@ -110,28 +110,26 @@ Here is an overview of version support through 2026:
| 11.0.x | May 14, 2024 | February 14, 2025 | Not Supported |
| 11.1.x | June 25, 2024 | April 23, 2025 | Not Supported |
| 11.2.x | August 27, 2024 | May 27, 2025 | Not Supported |
-| 11.3.x | October 22, 2024 | July 22, 2025 | Security & Critical Bugs Only |
+| 11.3.x | October 22, 2024 | July 22, 2025 | Not Supported |
| 11.4.x | December 5, 2024 | September 5, 2025 | Security & Critical Bugs Only |
| 11.5.x | January 28, 2025 | October 28, 2025 | Security & Critical Bugs Only |
-| 11.6.x (Last minor of 11) | March 25, 2025 | May 25, 2026 | Security & Critical Bugs Only |
-| 12.0.x | May 5, 2025 | February 5, 2026 | Full Support until next minor |
+| 11.6.x (Last minor of 11) | March 25, 2025 | June 25, 2026 | Security & Critical Bugs Only |
+| 12.0.x | May 5, 2025 | February 5, 2026 | Security & Critical Bugs Only |
| 12.1.x | July 22, 2025 | April 22, 2026 | Full Support until next minor |
-| 12.2.x | September 23, 2025 | June 23, 2026 | Full Support until next minor |
-| 12.3.x | November 18, 2025 | August 18, 2026 | Full Support until next minor |
+| 12.2.x | September 23, 2025 | June 23, 2026 | Yet to be released |
+| 12.3.x | November 18, 2025 | August 18, 2026 | Yet to be released |
## How are these versions supported?
The level of support changes as new versions of Grafana are released. Here are the key details:
- **Full Support**:
-
- All new features
- All bug fixes
- Security patches
- Regular updates
- **Security & Critical Bugs Only**:
-
- Security vulnerability patches
- Critical bug fixes that cause feature degradation
- No new features
diff --git a/docs/sources/whatsnew/_index.md b/docs/sources/whatsnew/_index.md
index 6c0a1386693..bcc9f3b4b4d 100644
--- a/docs/sources/whatsnew/_index.md
+++ b/docs/sources/whatsnew/_index.md
@@ -76,6 +76,7 @@ For a complete list of every change, with links to pull requests and related iss
## Grafana 12
+- [What's new in 12.1](https://grafana.com/docs/grafana//whatsnew/whats-new-in-v12-1)
- [What's new in 12.0](https://grafana.com/docs/grafana//whatsnew/whats-new-in-v12-0)
## Grafana 11
diff --git a/docs/sources/whatsnew/whats-new-in-v11-3.md b/docs/sources/whatsnew/whats-new-in-v11-3.md
index aafe83f2695..5eb55341a04 100644
--- a/docs/sources/whatsnew/whats-new-in-v11-3.md
+++ b/docs/sources/whatsnew/whats-new-in-v11-3.md
@@ -62,7 +62,6 @@ For configuring controls outside of playlist playback, you can use the following
- The [variable usage check](https://grafana.com/docs/grafana//dashboards/variables/inspect-variable/) is not yet available.
- Editing a panel:
-
- The **Library panels** tab is not available anymore. You can replace a library panel from the panel menu.
- The **Overrides** tab is not in panel options (coming in Grafana v11.3.0). Overrides are shown at the bottom of the option list.
- The drop-down menu to collapse the visualization picker is missing (coming in Grafana v11.3.0).
diff --git a/docs/sources/whatsnew/whats-new-in-v12-1.md b/docs/sources/whatsnew/whats-new-in-v12-1.md
new file mode 100644
index 00000000000..27e4f848682
--- /dev/null
+++ b/docs/sources/whatsnew/whats-new-in-v12-1.md
@@ -0,0 +1,53 @@
+---
+description: Feature and improvement highlights for Grafana v12.1
+keywords:
+ - grafana
+ - new
+ - documentation
+ - '12.1'
+ - release notes
+labels:
+ products:
+ - cloud
+ - enterprise
+ - oss
+title: What's new in Grafana v12.1
+posts:
+ - title: Data sources
+ items:
+ - whats-new/2025-06-11-logicmonitor-enterprise-data-source-for-grafana.md
+ - whats-new/2025-06-20-support-for-service-account-impersonation-in-bigquery.md
+ - whats-new/2025-07-08-keep-instances-running-smoothly-with-grafana-advisor.md
+ - title: Alerting
+ items:
+ - whats-new/2025-07-11-alert-rule-list-page-updates.md
+ - whats-new/2025-07-09-active-time-intervals-in-grafana-alerting.md
+ - whats-new/2025-07-14-add-ability-to-import-rules-to-gma-from-prometheus-yaml.md
+ - title: Dashboards and visualizations
+ items:
+ - whats-new/2025-06-30-transformations-regression-analysis.md
+ - whats-new/2025-07-14-custom-variable-support-in-visualization-actions.md
+ - whats-new/2025-07-10-server-configurable-quick-time-ranges-for-dashboards.md
+ - whats-new/2025-07-14-enhanced-custom-currency-format-display-exact-financial-values.md
+ - title: Authentication and authorization
+ items:
+ - whats-new/2025-07-14-entra-id-workload-identity-support.md
+whats_new_grafana_version: 12.1
+weight: -50
+---
+
+# What’s new in Grafana v12.1
+
+It’s 12.1 time! We’re really excited about GA for a new alert rule page that makes it easier to find what you need quickly, as well as the regression analysis transformation, helping you predict future data values or estimate missing data points that might not be exactly represented in the original dataset. Also, visualization actions now support custom variables. When triggered, actions prompt you to input whatever custom variable was defined, allowing you to tailor requests in real time without modifying dashboard configuration. This is super helpful for when you’re triggering alerts, filtering API calls, or sending user-defined parameters to external systems. And you can try out Grafana Advisor, which automatically detects plugin, data source, and SSO issues, keeping your Grafana instance healthy and secure.
+
+Speaking of security, Grafana now supports Entra Workload Identity, simplifying OAuth and increasing security for instances using Microsoft Azure. Thanks to community contributor [mehighlow](https://github.com/mehighlow) for this feature!
+
+We have one more community contributor to thank for this release. [Chris Hodges](https://github.com/chodges15) delivered server-configurable quick time ranges for dashboards. Now you can define custom time range presets for the time picker on dashboards, perfect for teams that routinely analyze specific, context-driven time windows.
+
+Keep reading to learn about what else we have in store for 12.1.
+
+
+
+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 v12.1, check out our [Upgrade Guide](https://grafana.com/docs/grafana//upgrade-guide/upgrade-v12.1/).
+
+{{< docs/whats-new >}}
diff --git a/e2e-playwright/dashboard-new-layouts/dashboards-edit-panel-title-description.spec.ts b/e2e-playwright/dashboard-new-layouts/dashboards-edit-panel-title-description.spec.ts
index 30373362528..425f01db823 100644
--- a/e2e-playwright/dashboard-new-layouts/dashboards-edit-panel-title-description.spec.ts
+++ b/e2e-playwright/dashboard-new-layouts/dashboards-edit-panel-title-description.spec.ts
@@ -51,8 +51,10 @@ test.describe(
// Get the tooltip ID from the aria-describedby attribute
const tooltipId = await descriptionIcon.getAttribute('aria-describedby');
- const tooltip = page.locator(`[id="${tooltipId}"]`);
- await expect(tooltip).toHaveText(`${newDescription}\n`);
+ await expect(async () => {
+ const tooltip = page.locator(`[id="${tooltipId}"]`);
+ await expect(tooltip).toHaveText(`${newDescription}\n`);
+ }).toPass();
});
}
);
diff --git a/e2e-playwright/dashboards-suite/dashboard-browse-nested.spec.ts b/e2e-playwright/dashboards-suite/dashboard-browse-nested.spec.ts
index 7f88e462deb..7dfbf455176 100644
--- a/e2e-playwright/dashboards-suite/dashboard-browse-nested.spec.ts
+++ b/e2e-playwright/dashboards-suite/dashboard-browse-nested.spec.ts
@@ -7,6 +7,12 @@ const NUM_ROOT_DASHBOARDS = 60;
const NUM_NESTED_FOLDERS = 60;
const NUM_NESTED_DASHBOARDS = 60;
+test.use({
+ featureToggles: {
+ tableNextGen: true,
+ },
+});
+
// TODO change this test so it doesn't conflict with the existing dashboard browse test
// probably needs a separate user
test.describe.skip(
@@ -101,7 +107,7 @@ test.describe.skip(
await expect(page.getByText('Nested folder 00')).toBeVisible();
// Get the table body container for scrolling
- const tableBody = page.getByTestId(selectors.pages.BrowseDashboards.table.body).locator('> div');
+ const tableBody = page.getByRole('grid');
// Scroll the page and check visibility of next set of items
await tableBody.evaluate((el) => el.scrollTo(0, 2100));
diff --git a/e2e-playwright/dashboards-suite/dashboard-live-streaming.spec.ts b/e2e-playwright/dashboards-suite/dashboard-live-streaming.spec.ts
index 79ae94c5e96..dcebf98884d 100644
--- a/e2e-playwright/dashboards-suite/dashboard-live-streaming.spec.ts
+++ b/e2e-playwright/dashboards-suite/dashboard-live-streaming.spec.ts
@@ -2,6 +2,12 @@ import { test, expect } from '@grafana/plugin-e2e';
import testDashboard from '../dashboards/DashboardLiveTest.json';
+test.use({
+ featureToggles: {
+ tableNextGen: true,
+ },
+});
+
test.describe(
'Dashboard Live streaming support',
{
@@ -31,18 +37,10 @@ test.describe(
}
});
- test('Should receive streaming data', async ({ gotoDashboardPage, selectors }) => {
+ test('Should receive streaming data', async ({ gotoDashboardPage, selectors, page }) => {
const dashboardPage = await gotoDashboardPage({ uid: dashboardUID });
await expect(dashboardPage.getByGrafanaSelector(selectors.components.Panels.Panel.title('Live'))).toBeVisible();
- await expect
- .poll(
- async () =>
- await dashboardPage
- .getByGrafanaSelector(selectors.components.Panels.Visualization.Table.body)
- .getByRole('row')
- .count()
- )
- .toBeGreaterThan(5);
+ await expect.poll(async () => await page.getByRole('grid').getByRole('row').count()).toBeGreaterThan(5);
});
}
);
diff --git a/e2e-playwright/dashboards-suite/dashboard-timepicker.spec.ts b/e2e-playwright/dashboards-suite/dashboard-timepicker.spec.ts
index ac505aa9cd4..e57c56b5afe 100644
--- a/e2e-playwright/dashboards-suite/dashboard-timepicker.spec.ts
+++ b/e2e-playwright/dashboards-suite/dashboard-timepicker.spec.ts
@@ -42,6 +42,9 @@ test.describe(
await page.getByTestId(selectors.components.TimeZonePicker.containerV2).click();
await page.getByRole('option', { name: 'Asia/Tokyo' }).click();
await page.getByTestId(selectors.components.UserProfile.preferencesSaveButton).click();
+ // wait for the page to reload before trying to navigate, otherwise this can cause flakes
+ // see e.g. https://github.com/microsoft/playwright/issues/21451#issuecomment-1502251404
+ await page.waitForURL('/profile');
// Open dashboard with time range from 8th to end of 10th.
// Will be Tokyo time because of above preference
diff --git a/e2e-playwright/panels-suite/geomap-spatial-operations-transform.spec.ts b/e2e-playwright/panels-suite/geomap-spatial-operations-transform.spec.ts
index 10df0887a0f..dc625ea4adc 100644
--- a/e2e-playwright/panels-suite/geomap-spatial-operations-transform.spec.ts
+++ b/e2e-playwright/panels-suite/geomap-spatial-operations-transform.spec.ts
@@ -2,13 +2,19 @@ import { test, expect } from '@grafana/plugin-e2e';
const DASHBOARD_ID = 'P2jR04WVk';
+test.use({
+ featureToggles: {
+ tableNextGen: true,
+ },
+});
+
test.describe(
'Panels test: Geomap spatial operations',
{
tag: ['@panels'],
},
() => {
- test('Tests location auto option', async ({ gotoDashboardPage, selectors }) => {
+ test('Tests location auto option', async ({ gotoDashboardPage, selectors, page }) => {
const dashboardPage = await gotoDashboardPage({
uid: DASHBOARD_ID,
queryParams: new URLSearchParams({ editPanel: '1' }),
@@ -40,12 +46,12 @@ test.describe(
await locationInput.press('Enter');
await dashboardPage.getByGrafanaSelector(selectors.components.PanelEditor.toggleTableView).click({ force: true });
- const tableHeader = dashboardPage.getByGrafanaSelector(selectors.components.Panels.Visualization.Table.header);
+ const tableHeader = page.getByRole('grid').getByRole('row').first();
await expect(tableHeader).toBeVisible();
await expect(tableHeader.getByText('Point')).toBeVisible();
});
- test('Tests location coords option', async ({ gotoDashboardPage, dashboardPage, selectors }) => {
+ test('Tests location coords option', async ({ gotoDashboardPage, dashboardPage, selectors, page }) => {
await gotoDashboardPage({ uid: DASHBOARD_ID, queryParams: new URLSearchParams({ editPanel: '1' }) });
await dashboardPage.getByGrafanaSelector(selectors.components.Tab.title('Transformations')).click();
@@ -90,7 +96,7 @@ test.describe(
await longitudeInput.press('Enter');
await dashboardPage.getByGrafanaSelector(selectors.components.PanelEditor.toggleTableView).click({ force: true });
- const tableHeader = dashboardPage.getByGrafanaSelector(selectors.components.Panels.Visualization.Table.header);
+ const tableHeader = page.getByRole('grid').getByRole('row').first();
await expect(tableHeader).toBeVisible();
await expect(tableHeader.getByText('Point')).toBeVisible();
});
@@ -99,6 +105,7 @@ test.describe(
gotoDashboardPage,
dashboardPage,
selectors,
+ page,
}) => {
await gotoDashboardPage({ uid: DASHBOARD_ID, queryParams: new URLSearchParams({ editPanel: '1' }) });
@@ -136,12 +143,12 @@ test.describe(
await geohashFieldInput.press('Enter');
await dashboardPage.getByGrafanaSelector(selectors.components.PanelEditor.toggleTableView).click({ force: true });
- const tableHeader = dashboardPage.getByGrafanaSelector(selectors.components.Panels.Visualization.Table.header);
+ const tableHeader = page.getByRole('grid').getByRole('row').first();
await expect(tableHeader).toBeVisible();
await expect(tableHeader.getByText('State 1')).toBeVisible();
});
- test('Tests location lookup option', async ({ gotoDashboardPage, dashboardPage, selectors }) => {
+ test('Tests location lookup option', async ({ gotoDashboardPage, dashboardPage, selectors, page }) => {
await gotoDashboardPage({ uid: DASHBOARD_ID, queryParams: new URLSearchParams({ editPanel: '1' }) });
await dashboardPage.getByGrafanaSelector(selectors.components.Tab.title('Transformations')).click();
@@ -186,7 +193,7 @@ test.describe(
await gazetteerFieldInput.press('Enter');
await dashboardPage.getByGrafanaSelector(selectors.components.PanelEditor.toggleTableView).click({ force: true });
- const tableHeader = dashboardPage.getByGrafanaSelector(selectors.components.Panels.Visualization.Table.header);
+ const tableHeader = page.getByRole('grid').getByRole('row').first();
await expect(tableHeader).toBeVisible();
await expect(tableHeader.getByText('Geometry')).toBeVisible();
});
diff --git a/e2e-playwright/panels-suite/panelEdit_base.spec.ts b/e2e-playwright/panels-suite/panelEdit_base.spec.ts
index 66584d0387b..da98e8089f5 100644
--- a/e2e-playwright/panels-suite/panelEdit_base.spec.ts
+++ b/e2e-playwright/panels-suite/panelEdit_base.spec.ts
@@ -2,6 +2,12 @@ import { test, expect } from '@grafana/plugin-e2e';
const PANEL_UNDER_TEST = 'Lines 500 data points';
+test.use({
+ featureToggles: {
+ tableNextGen: true,
+ },
+});
+
test.describe(
'Panels test: Panel edit base',
{
@@ -65,7 +71,7 @@ test.describe(
// Check that table view works
await expect(dashboardPage.getByGrafanaSelector(selectors.components.Panels.Panel.loadingBar(''))).toHaveCount(0);
await dashboardPage.getByGrafanaSelector(selectors.components.PanelEditor.toggleTableView).click({ force: true });
- const tableHeader = dashboardPage.getByGrafanaSelector(selectors.components.Panels.Visualization.Table.header);
+ const tableHeader = page.getByRole('grid').getByRole('row').first();
await expect(tableHeader).toBeVisible();
await expect(tableHeader.getByText('A-series')).toBeVisible();
diff --git a/e2e-playwright/panels-suite/table-kitchenSink.spec.ts b/e2e-playwright/panels-suite/table-kitchenSink.spec.ts
new file mode 100644
index 00000000000..7052ccfc510
--- /dev/null
+++ b/e2e-playwright/panels-suite/table-kitchenSink.spec.ts
@@ -0,0 +1,381 @@
+import { Page, Locator } from '@playwright/test';
+
+import { test, expect } from '@grafana/plugin-e2e';
+
+const DASHBOARD_UID = 'dcb9f5e9-8066-4397-889e-864b99555dbb';
+
+test.use({
+ viewport: { width: 2000, height: 1080 },
+ featureToggles: {
+ tableNextGen: true,
+ },
+});
+
+// helper utils
+const waitForTableLoad = async (loc: Page | Locator) => {
+ await expect(loc.locator('.rdg')).toBeVisible();
+};
+
+const getCell = async (loc: Page | Locator, rowIdx: number, colIdx: number) =>
+ loc
+ .getByRole('row')
+ .nth(rowIdx)
+ .getByRole(rowIdx === 0 ? 'columnheader' : 'gridcell')
+ .nth(colIdx);
+
+const getCellHeight = async (loc: Page | Locator, rowIdx: number, colIdx: number) => {
+ const cell = await getCell(loc, rowIdx, colIdx);
+ return (await cell.boundingBox())?.height ?? 0;
+};
+
+const getColumnIdx = async (loc: Page | Locator, columnName: string) => {
+ // find the index of the column "Long text." The kitchen sink table will change over time, but
+ // we can just find the column programatically and use it throughout the test.
+ let result = -1;
+ const colCount = await loc.getByRole('columnheader').count();
+ for (let colIdx = 0; colIdx < colCount; colIdx++) {
+ const cell = await getCell(loc, 0, colIdx);
+ if ((await cell.textContent()) === columnName) {
+ result = colIdx;
+ break;
+ }
+ }
+ if (result === -1) {
+ throw new Error(`Could not find the "${columnName}" column in the table`);
+ }
+ return result;
+};
+
+test.describe(
+ 'Panels test: Table - Kitchen Sink',
+ {
+ tag: ['@panels'],
+ },
+ () => {
+ test('Tests word wrap, hover overflow, and cell inspect', async ({ gotoDashboardPage, selectors, page }) => {
+ const dashboardPage = await gotoDashboardPage({
+ uid: DASHBOARD_UID,
+ queryParams: new URLSearchParams({ editPanel: '1' }),
+ });
+
+ await expect(
+ dashboardPage.getByGrafanaSelector(selectors.components.Panels.Panel.title('Table - Kitchen Sink'))
+ ).toBeVisible();
+
+ // to avoid a race condition when counting up , wait for react-data-grid to finish rendering.
+ await waitForTableLoad(page);
+
+ const longTextColIdx = await getColumnIdx(page, 'Long Text');
+
+ // text wrapping is enabled by default on this panel.
+ await expect(getCellHeight(page, 1, longTextColIdx)).resolves.toBeGreaterThan(100);
+
+ // toggle the lorem ipsum column's wrap text toggle and confirm that the height shrinks.
+ await dashboardPage
+ .getByGrafanaSelector(selectors.components.PanelEditor.OptionsPane.fieldLabel('Wrap text'))
+ .last()
+ .click();
+ await expect(getCellHeight(page, 1, longTextColIdx)).resolves.toBeLessThan(100);
+
+ // test that hover overflow works.
+ const loremIpsumCell = await getCell(page, 1, longTextColIdx);
+ await loremIpsumCell.scrollIntoViewIfNeeded();
+ await loremIpsumCell.hover();
+ await expect(getCellHeight(page, 1, longTextColIdx)).resolves.toBeGreaterThan(100);
+ await (await getCell(page, 1, longTextColIdx + 1)).hover();
+ await expect(getCellHeight(page, 1, longTextColIdx)).resolves.toBeLessThan(100);
+
+ // enable cell inspect, confirm that hover no longer triggers.
+ await dashboardPage
+ .getByGrafanaSelector(
+ selectors.components.PanelEditor.OptionsPane.fieldLabel('Cell options Cell value inspect')
+ )
+ .first()
+ .locator('label[for="custom.inspect"]')
+ .click();
+ await loremIpsumCell.hover();
+ await expect(getCellHeight(page, 1, longTextColIdx)).resolves.toBeLessThan(100);
+
+ // click cell inspect, check that cell inspection pops open in the side as we'd expect.
+ await loremIpsumCell.getByLabel('Inspect value').click();
+ const loremIpsumText = await loremIpsumCell.textContent();
+ expect(loremIpsumText).toBeDefined();
+ await expect(page.getByRole('dialog').getByText(loremIpsumText!)).toBeVisible();
+ });
+
+ test('Tests visibility and display name via overrides', async ({ gotoDashboardPage, selectors, page }) => {
+ const dashboardPage = await gotoDashboardPage({
+ uid: DASHBOARD_UID,
+ queryParams: new URLSearchParams({ editPanel: '1' }),
+ });
+
+ await expect(
+ dashboardPage.getByGrafanaSelector(selectors.components.Panels.Panel.title('Table - Kitchen Sink'))
+ ).toBeVisible();
+
+ // confirm that "State" column is hidden by default.
+ expect(page.getByRole('row').nth(0)).not.toContainText('State');
+
+ // toggle the "State" column visibility and test that it appears before re-hiding it.
+ // FIXME this selector is utterly godawful, but there's no way to give testIds or aria-labels or anything to
+ // the panel editor builder. we should fix that to make e2e's easier to write for our team.
+ const hideStateColumnSwitch = page.locator('[id="Override 12"]').locator('label').last();
+ await hideStateColumnSwitch.click();
+ expect(page.getByRole('row').nth(0)).toContainText('State');
+
+ // now change the display name of the "State" column.
+ // FIXME it would be good to have a better selector here too.
+ const displayNameInput = page.locator('[id="Override 12"]').locator('input[value="State"]').last();
+ await displayNameInput.fill('State (renamed)');
+ await displayNameInput.press('Enter');
+ expect(page.getByRole('row').nth(0)).toContainText('State (renamed)');
+ });
+
+ // we test niche cases for sorting, filtering, pagination, etc. in a unit tests already.
+ // we mainly want to test the happiest paths for these in e2es as well to check for integration
+ // issues, but the unit tests can confirm that the internal logic works as expected much more quickly and thoroughly.
+ // hashtag testing pyramid.
+ test('Tests sorting by column', async ({ gotoDashboardPage, selectors, page }) => {
+ const dashboardPage = await gotoDashboardPage({
+ uid: DASHBOARD_UID,
+ queryParams: new URLSearchParams({ editPanel: '1' }),
+ });
+
+ await expect(
+ dashboardPage.getByGrafanaSelector(selectors.components.Panels.Panel.title('Table - Kitchen Sink'))
+ ).toBeVisible();
+
+ // click the "State" column header to sort it.
+ const stateColumnHeader = await getCell(page, 0, 1);
+
+ await stateColumnHeader.getByText('Info').click();
+ await expect(stateColumnHeader).toHaveAttribute('aria-sort', 'ascending');
+ expect(getCell(page, 1, 1)).resolves.toContainText('down'); // down or down fast
+
+ await stateColumnHeader.getByText('Info').click();
+ await expect(stateColumnHeader).toHaveAttribute('aria-sort', 'descending');
+ expect(getCell(page, 1, 1)).resolves.toContainText('up'); // up or up fast
+
+ await stateColumnHeader.getByText('Info').click();
+ await expect(stateColumnHeader).not.toHaveAttribute('aria-sort');
+ });
+
+ test('Tests filtering within a column', async ({ gotoDashboardPage, selectors, page }) => {
+ const dashboardPage = await gotoDashboardPage({
+ uid: DASHBOARD_UID,
+ queryParams: new URLSearchParams({ editPanel: '1' }),
+ });
+
+ await expect(
+ dashboardPage.getByGrafanaSelector(selectors.components.Panels.Panel.title('Table - Kitchen Sink'))
+ ).toBeVisible();
+
+ await waitForTableLoad(page);
+
+ const infoColumnIdx = await getColumnIdx(page, 'Info');
+
+ const stateColumnHeader = page.getByRole('columnheader').nth(infoColumnIdx);
+
+ // get the first value in the "State" column, filter it out, then check that it went away.
+ const firstStateValue = (await (await getCell(page, 1, infoColumnIdx)).textContent())!;
+ await stateColumnHeader
+ .getByTestId(selectors.components.Panels.Visualization.TableNG.Filters.HeaderButton)
+ .click();
+ const filterContainer = dashboardPage.getByGrafanaSelector(
+ selectors.components.Panels.Visualization.TableNG.Filters.Container
+ );
+
+ await expect(filterContainer).toBeVisible();
+
+ // select all, then click the first value to unselect it, filtering it out.
+ await filterContainer.getByTestId(selectors.components.Panels.Visualization.TableNG.Filters.SelectAll).click();
+ await filterContainer.getByTitle(firstStateValue, { exact: true }).locator('label').click();
+ await filterContainer.getByRole('button', { name: 'Ok' }).click();
+
+ // make sure the filter container closed when we clicked "Ok".
+ await expect(filterContainer).not.toBeVisible();
+
+ // did it actually filter out our value?
+ await expect(getCell(page, 1, infoColumnIdx)).resolves.not.toHaveText(firstStateValue);
+ });
+
+ test('Tests pagination, row height adjustment', async ({ gotoDashboardPage, selectors, page }) => {
+ const rowRe = /([\d]+) - ([\d]+) of ([\d]+) rows/;
+ const getRowStatus = async (page: Page | Locator) => {
+ const text = (await page.getByText(rowRe).textContent()) ?? '';
+ const match = text.match(rowRe);
+ return {
+ start: parseInt(match?.[1] ?? '0', 10),
+ end: parseInt(match?.[2] ?? '0', 10),
+ total: parseInt(match?.[3] ?? '0', 10),
+ };
+ };
+
+ const dashboardPage = await gotoDashboardPage({
+ uid: DASHBOARD_UID,
+ queryParams: new URLSearchParams({ editPanel: '1' }),
+ });
+
+ await expect(
+ dashboardPage.getByGrafanaSelector(selectors.components.Panels.Panel.title('Table - Kitchen Sink'))
+ ).toBeVisible();
+
+ await page
+ .getByLabel(selectors.components.PanelEditor.OptionsPane.fieldLabel(`Enable pagination`), { exact: true })
+ .click();
+
+ // because of text wrapping, we're guaranteed to only be showing a single row when we enable pagination.
+ await expect(page.getByText(/([\d]+) - ([\d]+) of ([\d]+) rows/)).toBeVisible();
+
+ // disable text wrap and see the number of rows.
+ await dashboardPage
+ .getByGrafanaSelector(selectors.components.PanelEditor.OptionsPane.fieldLabel('Wrap text'))
+ .last()
+ .click();
+
+ // any number of rows that is not "1" is allowed here, we don't want to police the exact number of rows that
+ // are rendered since there are tons of factors which could effect this. we do want to grab this number for comparison
+ // in a second, though.
+ const smallRowStatus = await getRowStatus(page);
+ expect(smallRowStatus.end).toBeGreaterThan(1);
+ expect(page.getByRole('grid').getByRole('row')).toHaveCount(smallRowStatus.end + 1);
+
+ // change cell height to Large
+ await dashboardPage
+ .getByGrafanaSelector(selectors.components.PanelEditor.OptionsPane.fieldLabel('Table Cell height'))
+ .locator('input')
+ .last()
+ .click();
+ const largeRowStatus = await getRowStatus(page);
+ expect(largeRowStatus.end).toBeLessThan(smallRowStatus.end);
+ expect(page.getByRole('grid').getByRole('row')).toHaveCount(largeRowStatus.end + 1);
+
+ // click a page over with the directional nav
+ await page.getByLabel('next page').click();
+ const nextPageStatus = await getRowStatus(page);
+ expect(nextPageStatus.start).toBe(largeRowStatus.end + 1);
+ expect(nextPageStatus.end).toBe(largeRowStatus.end * 2);
+ expect(nextPageStatus.total).toBe(largeRowStatus.total);
+
+ // click a page number
+ await page
+ .getByTestId('data-testid panel content')
+ .getByRole('navigation')
+ .getByText('4', { exact: true })
+ .click();
+ const fourthPageStatus = await getRowStatus(page);
+ expect(fourthPageStatus.start).toBe(largeRowStatus.end * 3 + 1);
+ expect(fourthPageStatus.end).toBe(largeRowStatus.end * 4);
+ expect(fourthPageStatus.total).toBe(largeRowStatus.total);
+ });
+
+ test('Tests DataLinks (single and multi) and actions', async ({ gotoDashboardPage, selectors, page }) => {
+ const addDataLink = async (title: string, url: string) => {
+ await dashboardPage
+ .getByGrafanaSelector(
+ selectors.components.PanelEditor.OptionsPane.fieldLabel('Data links and actions Data links')
+ )
+ .locator('button')
+ .filter({ hasText: 'Add link' })
+ .click();
+
+ // DataLinks dialog has popped open - fill it in and add a global datalink.
+ await expect(page.getByRole('dialog')).toBeVisible();
+ await page.getByRole('dialog').locator('#link-title').fill(title);
+ await page.getByRole('dialog').locator('#data-link-input [contenteditable="true"]').focus();
+ await page.getByRole('dialog').locator('#data-link-input [contenteditable="true"]').fill(url);
+ await page.getByRole('dialog').locator('#data-link-input [contenteditable="true"]').blur();
+ await page.getByRole('dialog').locator('button[aria-disabled="false"]').filter({ hasText: 'Save' }).click();
+ await expect(page.getByRole('dialog')).not.toBeVisible();
+ };
+
+ const dashboardPage = await gotoDashboardPage({
+ uid: DASHBOARD_UID,
+ queryParams: new URLSearchParams({ editPanel: '1' }),
+ });
+
+ await expect(
+ dashboardPage.getByGrafanaSelector(selectors.components.Panels.Panel.title('Table - Kitchen Sink'))
+ ).toBeVisible();
+
+ // disable text wrapping for this test to make it easier to click the links, the long lorem ipsum
+ // can push the links off the screen.
+ await dashboardPage
+ .getByGrafanaSelector(selectors.components.PanelEditor.OptionsPane.fieldLabel('Wrap text'))
+ .last()
+ .click();
+
+ const infoColumnIdx = await getColumnIdx(page, 'Info');
+ const pillColIdx = await getColumnIdx(page, 'Pills');
+ const dataLinkColIdx = await getColumnIdx(page, 'Data Link');
+
+ // Info column has a single DataLink by default.
+ const infoCell = await getCell(page, 1, infoColumnIdx);
+ await expect(infoCell.locator('a')).toBeVisible();
+ expect(infoCell.locator('a')).toHaveAttribute('href');
+ expect(infoCell.locator('a')).not.toHaveAttribute('aria-haspopup');
+
+ // now, add a DataLink to the whole table
+ await addDataLink('Test link', 'https://grafana.com');
+
+ // add a DataLink to the whole table, all cells will now have a single link.
+ const colCount = await page.getByRole('row').nth(1).getByRole('gridcell').count();
+ for (let colIdx = 0; colIdx < colCount; colIdx++) {
+ // - pills column currently does not support DataLinks.
+ // - we don't apply DataLinks to the DataLinks column itself, since they're rendered inside.
+ if (colIdx === pillColIdx || colIdx === dataLinkColIdx) {
+ continue;
+ }
+
+ const cell = await getCell(page, 1, colIdx);
+ await expect(cell.locator('a')).toBeVisible();
+ expect(cell.locator('a')).toHaveAttribute('href');
+ expect(cell.locator('a')).not.toHaveAttribute('aria-haspopup', 'menu');
+ }
+
+ const headerContainer = dashboardPage.getByGrafanaSelector(selectors.components.Panels.Panel.headerContainer);
+
+ // add another data link. now we'll check that the multi-link popups work.
+ await addDataLink('Another test link', 'https://grafana.com/foo');
+
+ // loop thru the columns, click the links, observe that the tooltip appears, and close the tooltip.
+ for (let colIdx = 0; colIdx < colCount; colIdx++) {
+ const cell = await getCell(page, 1, colIdx);
+ if (colIdx === infoColumnIdx) {
+ // the Info column should still have its single link.
+ expect(cell.locator('a')).not.toHaveAttribute('aria-haspopup', 'menu');
+ continue;
+ }
+
+ // - pills column currently does not support DataLinks.
+ // - we don't apply DataLinks to the DataLinks column itself, since they're rendered inside.
+ if (colIdx === pillColIdx || colIdx === dataLinkColIdx) {
+ continue;
+ }
+
+ await cell.locator('a').click({ force: true });
+ await expect(page.getByTestId(selectors.components.DataLinksActionsTooltip.tooltipWrapper)).toBeVisible();
+
+ await headerContainer.click(); // convenient just to click the header to close the tooltip.
+ await expect(page.getByTestId(selectors.components.DataLinksActionsTooltip.tooltipWrapper)).not.toBeVisible();
+ }
+
+ // add an Action to the whole table and check that the action button is added to the tooltip.
+ // TODO -- saving for another day.
+ });
+
+ test('Empty Table panel', async ({ gotoDashboardPage, selectors }) => {
+ const dashboardPage = await gotoDashboardPage({
+ uid: DASHBOARD_UID,
+ queryParams: new URLSearchParams({ editPanel: '2' }),
+ });
+
+ await expect(
+ dashboardPage.getByGrafanaSelector(selectors.components.Panels.Panel.PanelDataErrorMessage)
+ ).toBeVisible();
+ await expect(
+ dashboardPage.getByGrafanaSelector(selectors.components.Panels.Panel.title('Table - Kitchen Sink'))
+ ).not.toBeVisible();
+ });
+ }
+);
diff --git a/e2e-playwright/panels-suite/table-sparkline.spec.ts b/e2e-playwright/panels-suite/table-sparkline.spec.ts
new file mode 100644
index 00000000000..16dc55f3df4
--- /dev/null
+++ b/e2e-playwright/panels-suite/table-sparkline.spec.ts
@@ -0,0 +1,29 @@
+import { test, expect } from '@grafana/plugin-e2e';
+
+test.use({
+ viewport: { width: 1280, height: 1080 },
+ featureToggles: {
+ tableNextGen: true,
+ },
+});
+
+test.describe(
+ 'Panels test: Table - Sparkline',
+ {
+ tag: ['@panels'],
+ },
+ () => {
+ test('Tests sparkline tables are successfully rendered', async ({ gotoDashboardPage, selectors, page }) => {
+ await gotoDashboardPage({
+ uid: 'd6373b49-1957-4f00-9218-ee2120d3ecd9',
+ queryParams: new URLSearchParams({ editPanel: '2' }),
+ });
+
+ await expect(page.getByRole('grid')).toBeVisible();
+
+ const uplotCount = await page.locator('.uplot').count();
+ const rowCount = await page.getByRole('row').count();
+ expect(uplotCount).toBe(rowCount - 1);
+ });
+ }
+);
diff --git a/e2e-playwright/plugin-e2e/plugin-e2e-api-tests/as-admin-user/panelEditPage.spec.ts b/e2e-playwright/plugin-e2e/plugin-e2e-api-tests/as-admin-user/panelEditPage.spec.ts
index 4772a9717e8..577a758d97e 100644
--- a/e2e-playwright/plugin-e2e/plugin-e2e-api-tests/as-admin-user/panelEditPage.spec.ts
+++ b/e2e-playwright/plugin-e2e/plugin-e2e-api-tests/as-admin-user/panelEditPage.spec.ts
@@ -11,6 +11,12 @@ const STANDARD_OTIONS_CATEGORY = 'Standard options';
const DISPLAY_NAME_LABEL = 'Display name';
const REACT_TABLE_DASHBOARD = { uid: 'U_bZIMRMk' };
+test.use({
+ featureToggles: {
+ tableNextGen: true,
+ },
+});
+
test.describe(
'plugin-e2e-api-tests admin',
{
@@ -53,7 +59,7 @@ test.describe(
).toHaveText(scenarios.map((s) => s.name));
});
- test('mocked query data response', async ({ panelEditPage, selectors }) => {
+ test('mocked query data response', async ({ panelEditPage, page }) => {
await panelEditPage.mockQueryDataResponse(successfulDataQuery, 200);
await panelEditPage.datasource.set('gdev-testdata');
await panelEditPage.setVisualization(TABLE_VIZ_NAME);
@@ -63,9 +69,9 @@ test.describe(
formatExpectError('Did not expect panel error to be displayed after query execution')
).toBeHidden();
await expect(
- panelEditPage.getByGrafanaSelector(selectors.components.Panels.Visualization.Table.body),
+ page.getByRole('grid'),
formatExpectError('Expected certain select options to be displayed after clicking on the select input')
- ).toHaveText('val1val2val3val4');
+ ).toHaveText(/val1val2val3val4/);
});
});
diff --git a/e2e-playwright/start-and-run-suite b/e2e-playwright/start-server
similarity index 60%
rename from e2e-playwright/start-and-run-suite
rename to e2e-playwright/start-server
index 3322f449345..6685cd472d0 100755
--- a/e2e-playwright/start-and-run-suite
+++ b/e2e-playwright/start-server
@@ -15,9 +15,6 @@ fi
if [ "$BASE_URL" != "" ]; then
echo -e "BASE_URL set, skipping starting server"
else
- # Start it in the background
- ./scripts/grafana-server/start-server $LICENSE_PATH 2>&1 > scripts/grafana-server/server.log &
- ./scripts/grafana-server/wait-for-grafana
+ ./scripts/grafana-server/start-server $LICENSE_PATH > scripts/grafana-server/server.log
fi
-PORT=3001 HOST=localhost yarn playwright test
diff --git a/e2e-playwright/test-plugins/grafana-extensionstest-app/package.json b/e2e-playwright/test-plugins/grafana-extensionstest-app/package.json
index d11250bdc4d..89d6c90be5d 100644
--- a/e2e-playwright/test-plugins/grafana-extensionstest-app/package.json
+++ b/e2e-playwright/test-plugins/grafana-extensionstest-app/package.json
@@ -1,6 +1,6 @@
{
"name": "@test-plugins/extensions-test-app",
- "version": "12.1.0-pre",
+ "version": "12.2.0-pre",
"private": true,
"scripts": {
"build": "NODE_OPTIONS='--experimental-strip-types --no-warnings=ExperimentalWarning' webpack -c ./webpack.config.ts --env production",
diff --git a/e2e-playwright/test-plugins/grafana-test-datasource/package.json b/e2e-playwright/test-plugins/grafana-test-datasource/package.json
index 9f976341268..7ed88373c45 100644
--- a/e2e-playwright/test-plugins/grafana-test-datasource/package.json
+++ b/e2e-playwright/test-plugins/grafana-test-datasource/package.json
@@ -1,6 +1,6 @@
{
"name": "@test-plugins/grafana-e2etest-datasource",
- "version": "12.1.0-pre",
+ "version": "12.2.0-pre",
"private": true,
"scripts": {
"build": "NODE_OPTIONS='--experimental-strip-types --no-warnings=ExperimentalWarning' webpack -c ./webpack.config.ts --env production",
diff --git a/e2e-playwright/various-suite/visualization-suggestions.spec.ts b/e2e-playwright/various-suite/visualization-suggestions.spec.ts
index 964af821caa..38c6f30d298 100644
--- a/e2e-playwright/various-suite/visualization-suggestions.spec.ts
+++ b/e2e-playwright/various-suite/visualization-suggestions.spec.ts
@@ -1,5 +1,11 @@
import { test, expect } from '@grafana/plugin-e2e';
+test.use({
+ featureToggles: {
+ tableNextGen: true,
+ },
+});
+
test.describe(
'Visualization suggestions',
{
@@ -39,9 +45,7 @@ test.describe(
await panelEditPage.getByGrafanaSelector(selectors.components.VisualizationPreview.card('Table')).click();
// Verify table header is visible
- await expect(
- panelEditPage.getByGrafanaSelector(selectors.components.Panels.Visualization.Table.header)
- ).toBeVisible();
+ await expect(page.getByRole('grid').getByRole('row').first()).toBeVisible();
});
}
);
diff --git a/e2e/dashboards-suite/dashboard-live-streaming.spec.ts b/e2e/dashboards-suite/dashboard-live-streaming.spec.ts
index 089b3ec4beb..0623c8c30c7 100644
--- a/e2e/dashboards-suite/dashboard-live-streaming.spec.ts
+++ b/e2e/dashboards-suite/dashboard-live-streaming.spec.ts
@@ -9,7 +9,7 @@ describe.skip('Dashboard Live streaming support', () => {
});
it('Should receive streaming data', () => {
- e2e.flows.openDashboard({ uid: 'live-e2e-test' });
+ e2e.flows.openDashboard({ uid: 'live-e2e-test', queryParams: { '__feature.tableNextGen': false } });
cy.wait(1000);
e2e.components.Panels.Panel.title('Live').should('exist');
e2e.components.Panels.Visualization.Table.body().find('[role="row"]').should('have.length.at.least', 5);
diff --git a/e2e/old-arch/dashboards-suite/dashboard-live-streaming.spec.ts b/e2e/old-arch/dashboards-suite/dashboard-live-streaming.spec.ts
index b91ccf5c270..5798b669f6f 100644
--- a/e2e/old-arch/dashboards-suite/dashboard-live-streaming.spec.ts
+++ b/e2e/old-arch/dashboards-suite/dashboard-live-streaming.spec.ts
@@ -8,7 +8,7 @@ describe('Dashboard Live streaming support', () => {
});
it('Should receive streaming data', () => {
- e2e.flows.openDashboard({ uid: 'live-e2e-test' });
+ e2e.flows.openDashboard({ uid: 'live-e2e-test', queryParams: { '__feature.tableNextGen': false } });
cy.wait(1000);
e2e.components.Panels.Panel.title('Live').should('exist');
e2e.components.Panels.Visualization.Table.body().find('[role="row"]').should('have.length.at.least', 5);
diff --git a/e2e/old-arch/panels-suite/geomap-spatial-operations-transform.spec.ts b/e2e/old-arch/panels-suite/geomap-spatial-operations-transform.spec.ts
index f8aab30de2f..7c8d3d4f197 100644
--- a/e2e/old-arch/panels-suite/geomap-spatial-operations-transform.spec.ts
+++ b/e2e/old-arch/panels-suite/geomap-spatial-operations-transform.spec.ts
@@ -8,7 +8,7 @@ describe.skip('Geomap spatial operations', () => {
});
it.skip('Tests location auto option', () => {
- e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { editPanel: 1 } });
+ e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { '__feature.tableNextGen': false, editPanel: 1 } });
e2e.components.Tab.title('Transform data').should('be.visible').click();
e2e.components.Transforms.addTransformationButton().scrollIntoView().should('be.visible').click();
@@ -26,7 +26,7 @@ describe.skip('Geomap spatial operations', () => {
});
it('Tests location coords option', () => {
- e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { editPanel: 1 } });
+ e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { '__feature.tableNextGen': false, editPanel: 1 } });
e2e.components.Tab.title('Transform data').should('be.visible').click();
e2e.components.Transforms.addTransformationButton().scrollIntoView().should('be.visible').click();
@@ -50,7 +50,7 @@ describe.skip('Geomap spatial operations', () => {
});
it('Tests geoshash field column appears in table view', () => {
- e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { editPanel: 1 } });
+ e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { '__feature.tableNextGen': false, editPanel: 1 } });
e2e.components.Tab.title('Transform data').should('be.visible').click();
e2e.components.Transforms.addTransformationButton().scrollIntoView().should('be.visible').click();
@@ -73,7 +73,7 @@ describe.skip('Geomap spatial operations', () => {
});
it('Tests location lookup option', () => {
- e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { editPanel: 1 } });
+ e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { '__feature.tableNextGen': false, editPanel: 1 } });
e2e.components.Tab.title('Transform data').should('be.visible').click();
e2e.components.Transforms.addTransformationButton().scrollIntoView().should('be.visible').click();
diff --git a/e2e/old-arch/panels-suite/panelEdit_base.spec.ts b/e2e/old-arch/panels-suite/panelEdit_base.spec.ts
index 744c41ed8ce..8691382f90f 100644
--- a/e2e/old-arch/panels-suite/panelEdit_base.spec.ts
+++ b/e2e/old-arch/panels-suite/panelEdit_base.spec.ts
@@ -11,7 +11,7 @@ describe('Panel edit tests', () => {
cy.intercept({
pathname: '/api/ds/query',
}).as('query');
- e2e.flows.openDashboard({ uid: 'TkZXxlNG3' });
+ e2e.flows.openDashboard({ uid: 'TkZXxlNG3', queryParams: { '__feature.tableNextGen': false } });
cy.wait('@query');
e2e.flows.openPanelMenuItem(e2e.flows.PanelMenuItems.Edit, PANEL_UNDER_TEST);
diff --git a/e2e/old-arch/various-suite/visualization-suggestions.spec.ts b/e2e/old-arch/various-suite/visualization-suggestions.spec.ts
index aef309ea452..c5dfb03ef93 100644
--- a/e2e/old-arch/various-suite/visualization-suggestions.spec.ts
+++ b/e2e/old-arch/various-suite/visualization-suggestions.spec.ts
@@ -6,7 +6,7 @@ describe('Visualization suggestions', () => {
});
it('Should be shown and clickable', () => {
- e2e.flows.openDashboard({ uid: 'aBXrJ0R7z', queryParams: { editPanel: 9 } });
+ e2e.flows.openDashboard({ uid: 'aBXrJ0R7z', queryParams: { '__feature.tableNextGen': false, editPanel: 9 } });
// Try visualization suggestions
e2e.components.PanelEditor.toggleVizPicker().click();
diff --git a/e2e/panels-suite/geomap-spatial-operations-transform.spec.ts b/e2e/panels-suite/geomap-spatial-operations-transform.spec.ts
index 615e69996a4..4eb24162791 100644
--- a/e2e/panels-suite/geomap-spatial-operations-transform.spec.ts
+++ b/e2e/panels-suite/geomap-spatial-operations-transform.spec.ts
@@ -8,7 +8,7 @@ describe.skip('Geomap spatial operations', () => {
});
it('Tests location auto option', () => {
- e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { editPanel: 1 } });
+ e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { '__feature.tableNextGen': false, editPanel: 1 } });
e2e.components.Tab.title('Transformations').should('be.visible').click();
e2e.components.Transforms.addTransformationButton().scrollIntoView().should('be.visible').click();
@@ -26,7 +26,7 @@ describe.skip('Geomap spatial operations', () => {
});
it('Tests location coords option', () => {
- e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { editPanel: 1 } });
+ e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { '__feature.tableNextGen': false, editPanel: 1 } });
e2e.components.Tab.title('Transformations').should('be.visible').click();
e2e.components.Transforms.addTransformationButton().scrollIntoView().should('be.visible').click();
@@ -50,7 +50,7 @@ describe.skip('Geomap spatial operations', () => {
});
it('Tests geoshash field column appears in table view', () => {
- e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { editPanel: 1 } });
+ e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { '__feature.tableNextGen': false, editPanel: 1 } });
e2e.components.Tab.title('Transformations').should('be.visible').click();
e2e.components.Transforms.addTransformationButton().scrollIntoView().should('be.visible').click();
@@ -73,7 +73,7 @@ describe.skip('Geomap spatial operations', () => {
});
it('Tests location lookup option', () => {
- e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { editPanel: 1 } });
+ e2e.flows.openDashboard({ uid: DASHBOARD_ID, queryParams: { '__feature.tableNextGen': false, editPanel: 1 } });
e2e.components.Tab.title('Transformations').should('be.visible').click();
e2e.components.Transforms.addTransformationButton().scrollIntoView().should('be.visible').click();
diff --git a/e2e/panels-suite/panelEdit_base.spec.ts b/e2e/panels-suite/panelEdit_base.spec.ts
index 67717fb06b3..d48879e5a8d 100644
--- a/e2e/panels-suite/panelEdit_base.spec.ts
+++ b/e2e/panels-suite/panelEdit_base.spec.ts
@@ -13,7 +13,7 @@ describe('Panel edit tests', () => {
cy.intercept({
pathname: '/api/ds/query',
}).as('query');
- e2e.flows.openDashboard({ uid: 'TkZXxlNG3' });
+ e2e.flows.openDashboard({ uid: 'TkZXxlNG3', queryParams: { '__feature.tableNextGen': false } });
cy.wait('@query');
e2e.components.Panels.Panel.title('Lines 500 data points')
diff --git a/e2e/various-suite/visualization-suggestions.spec.ts b/e2e/various-suite/visualization-suggestions.spec.ts
index aef309ea452..c5dfb03ef93 100644
--- a/e2e/various-suite/visualization-suggestions.spec.ts
+++ b/e2e/various-suite/visualization-suggestions.spec.ts
@@ -6,7 +6,7 @@ describe('Visualization suggestions', () => {
});
it('Should be shown and clickable', () => {
- e2e.flows.openDashboard({ uid: 'aBXrJ0R7z', queryParams: { editPanel: 9 } });
+ e2e.flows.openDashboard({ uid: 'aBXrJ0R7z', queryParams: { '__feature.tableNextGen': false, editPanel: 9 } });
// Try visualization suggestions
e2e.components.PanelEditor.toggleVizPicker().click();
diff --git a/eslint.config.js b/eslint.config.js
index d5bd122f12c..c31f2f77930 100644
--- a/eslint.config.js
+++ b/eslint.config.js
@@ -311,6 +311,7 @@ module.exports = [
files: [
'public/app/!(plugins)/**/*.{ts,tsx,js,jsx}',
'packages/grafana-ui/**/*.{ts,tsx,js,jsx}',
+ 'packages/grafana-data/**/*.{ts,tsx,js,jsx}',
'packages/grafana-sql/**/*.{ts,tsx,js,jsx}',
'packages/grafana-prometheus/**/*.{ts,tsx,js,jsx}',
...pluginsToTranslate.map((plugin) => `${plugin}/**/*.{ts,tsx,js,jsx}`),
@@ -409,4 +410,22 @@ module.exports = [
],
},
},
+ {
+ name: 'grafana/no-extensions-imports',
+ files: ['**/*.{ts,tsx,js}'],
+ ignores: ['public/app/extensions/**/*'],
+ rules: {
+ 'no-restricted-imports': [
+ 'error',
+ {
+ patterns: [
+ {
+ group: ['app/extensions', 'app/extensions/*'],
+ message: 'Importing from app/extensions is not allowed',
+ },
+ ],
+ },
+ ],
+ },
+ },
];
diff --git a/go.mod b/go.mod
index b922613a0a8..46c47ef1f6e 100644
--- a/go.mod
+++ b/go.mod
@@ -1,6 +1,6 @@
module github.com/grafana/grafana
-go 1.24.4
+go 1.24.5
require (
buf.build/gen/go/parca-dev/parca/connectrpc/go v1.18.1-20250703125925-3f0fcf4bff96.1 // @grafana/observability-traces-and-profiling
@@ -22,7 +22,7 @@ require (
github.com/BurntSushi/toml v1.5.0 // @grafana/identity-access-team
github.com/DATA-DOG/go-sqlmock v1.5.2 // @grafana/grafana-search-and-storage
github.com/Masterminds/semver v1.5.0 // @grafana/grafana-backend-group
- github.com/Masterminds/semver/v3 v3.3.1 // @grafana/grafana-developer-enablement-squad
+ github.com/Masterminds/semver/v3 v3.4.0 // @grafana/grafana-developer-enablement-squad
github.com/Masterminds/sprig/v3 v3.3.0 // @grafana/grafana-backend-group
github.com/ProtonMail/go-crypto v1.1.6 // @grafana/plugins-platform-backend
github.com/VividCortex/mysqlerr v0.0.0-20170204212430-6c6b55f8796f // @grafana/grafana-backend-group
@@ -85,7 +85,7 @@ require (
github.com/googleapis/gax-go/v2 v2.14.2 // @grafana/grafana-backend-group
github.com/gorilla/mux v1.8.1 // @grafana/grafana-backend-group
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // @grafana/grafana-app-platform-squad
- github.com/grafana/alerting v0.0.0-20250716142237-8308539caa27 // @grafana/alerting-backend
+ github.com/grafana/alerting v0.0.0-20250725130805-615c8286e14b // @grafana/alerting-backend
github.com/grafana/authlib v0.0.0-20250710201142-9542f2f28d43 // @grafana/identity-access-team
github.com/grafana/authlib/types v0.0.0-20250710201142-9542f2f28d43 // @grafana/identity-access-team
github.com/grafana/dataplane/examples v0.0.1 // @grafana/observability-metrics
@@ -95,16 +95,16 @@ require (
github.com/grafana/gofpdf v0.0.0-20250307124105-3b9c5d35577f // @grafana/sharing-squad
github.com/grafana/gomemcache v0.0.0-20250318131618-74242eea118d // @grafana/grafana-operator-experience-squad
github.com/grafana/grafana-api-golang-client v0.27.0 // @grafana/alerting-backend
- github.com/grafana/grafana-app-sdk v0.39.2 // @grafana/grafana-app-platform-squad
- github.com/grafana/grafana-app-sdk/logging v0.39.1 // @grafana/grafana-app-platform-squad
+ github.com/grafana/grafana-app-sdk v0.40.0 // @grafana/grafana-app-platform-squad
+ github.com/grafana/grafana-app-sdk/logging v0.39.3 // @grafana/grafana-app-platform-squad
github.com/grafana/grafana-aws-sdk v1.0.4 // @grafana/aws-datasources
github.com/grafana/grafana-azure-sdk-go/v2 v2.1.6 // @grafana/partner-datasources
- github.com/grafana/grafana-cloud-migration-snapshot v1.6.0 // @grafana/grafana-operator-experience-squad
+ github.com/grafana/grafana-cloud-migration-snapshot v1.9.0 // @grafana/grafana-operator-experience-squad
github.com/grafana/grafana-google-sdk-go v0.4.1 // @grafana/partner-datasources
github.com/grafana/grafana-openapi-client-go v0.0.0-20231213163343-bd475d63fb79 // @grafana/grafana-backend-group
github.com/grafana/grafana-plugin-sdk-go v0.278.0 // @grafana/plugins-platform-backend
github.com/grafana/loki/v3 v3.2.1 // @grafana/observability-logs
- github.com/grafana/nanogit v0.0.0-20250709085038-55508a6a9f40 // @grafana-app-platform-squad
+ github.com/grafana/nanogit v0.0.0-20250723104447-68f58f5ecec0 // @grafana-app-platform-squad
github.com/grafana/otel-profiling-go v0.5.1 // @grafana/grafana-backend-group
github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // @grafana/observability-traces-and-profiling
github.com/grafana/pyroscope/api v1.2.1-0.20250415190842-3ff7247547ae // @grafana/observability-traces-and-profiling
@@ -112,7 +112,7 @@ require (
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // @grafana/grafana-search-and-storage
github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.1.0 // @grafana/plugins-platform-backend
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 // @grafana/grafana-backend-group
- github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // @grafana/identity-access-team
+ github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // @grafana/identity-access-team
github.com/hashicorp/go-hclog v1.6.3 // @grafana/plugins-platform-backend
github.com/hashicorp/go-multierror v1.1.1 // @grafana/alerting-squad
github.com/hashicorp/go-plugin v1.6.3 // @grafana/plugins-platform-backend
@@ -155,7 +155,7 @@ require (
github.com/prometheus/alertmanager v0.28.0 // @grafana/alerting-backend
github.com/prometheus/client_golang v1.22.0 // @grafana/alerting-backend
github.com/prometheus/client_model v0.6.2 // @grafana/grafana-backend-group
- github.com/prometheus/common v0.64.0 // @grafana/alerting-backend
+ github.com/prometheus/common v0.65.0 // @grafana/alerting-backend
github.com/prometheus/prometheus v0.303.1 // @grafana/alerting-backend
github.com/prometheus/sigv4 v0.1.2 // @grafana/alerting-backend
github.com/redis/go-redis/v9 v9.7.3 // @grafana/alerting-backend
@@ -165,7 +165,7 @@ require (
github.com/shopspring/decimal v1.4.0 // @grafana/grafana-datasources-core-services
github.com/spf13/cobra v1.9.1 // @grafana/grafana-app-platform-squad
github.com/spf13/pflag v1.0.6 // @grafana-app-platform-squad
- github.com/spyzhov/ajson v0.9.6 // @grafana/grafana-backend-group
+ github.com/spyzhov/ajson v0.9.6 // @grafana/grafana-sharing-squad
github.com/stretchr/testify v1.10.0 // @grafana/grafana-backend-group
github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf // @grafana/grafana-backend-group
github.com/tjhop/slog-gokit v0.1.3 // @grafana/grafana-app-platform-squad
@@ -181,15 +181,15 @@ require (
go.opentelemetry.io/collector/pdata v1.30.0 // @grafana/grafana-backend-group
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // @grafana/plugins-platform-backend
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.61.0 // @grafana/grafana-operator-experience-squad
- go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // @grafana/sharing-squad
+ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 // @grafana/sharing-squad
go.opentelemetry.io/contrib/propagators/jaeger v1.36.0 // @grafana/grafana-backend-group
go.opentelemetry.io/contrib/samplers/jaegerremote v0.30.0 // @grafana/grafana-backend-group
- go.opentelemetry.io/otel v1.36.0 // @grafana/grafana-backend-group
+ go.opentelemetry.io/otel v1.37.0 // @grafana/grafana-backend-group
go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // @grafana/grafana-backend-group
- go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0 // @grafana/grafana-backend-group
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0 // @grafana/grafana-backend-group
- go.opentelemetry.io/otel/sdk v1.36.0 // @grafana/grafana-backend-group
- go.opentelemetry.io/otel/trace v1.36.0 // @grafana/grafana-backend-group
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 // @grafana/grafana-backend-group
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 // @grafana/grafana-backend-group
+ go.opentelemetry.io/otel/sdk v1.37.0 // @grafana/grafana-backend-group
+ go.opentelemetry.io/otel/trace v1.37.0 // @grafana/grafana-backend-group
go.uber.org/atomic v1.11.0 // @grafana/alerting-backend
go.uber.org/goleak v1.3.0 // @grafana/grafana-search-and-storage
go.uber.org/zap v1.27.0 // @grafana/identity-access-team
@@ -200,7 +200,7 @@ require (
golang.org/x/mod v0.25.0 // indirect; @grafana/grafana-backend-group
golang.org/x/net v0.41.0 // @grafana/oss-big-tent @grafana/partner-datasources
golang.org/x/oauth2 v0.30.0 // @grafana/identity-access-team
- golang.org/x/sync v0.15.0 // @grafana/alerting-backend
+ golang.org/x/sync v0.16.0 // @grafana/alerting-backend
golang.org/x/text v0.26.0 // @grafana/grafana-backend-group
golang.org/x/time v0.11.0 // @grafana/grafana-backend-group
golang.org/x/tools v0.34.0 // indirect; @grafana/grafana-as-code
@@ -212,15 +212,15 @@ require (
gopkg.in/mail.v2 v2.3.1 // @grafana/grafana-backend-group
gopkg.in/yaml.v2 v2.4.0 // @grafana/alerting-backend
gopkg.in/yaml.v3 v3.0.1 // @grafana/alerting-backend
- k8s.io/api v0.33.2 // @grafana/grafana-app-platform-squad
- k8s.io/apimachinery v0.33.2 // @grafana/grafana-app-platform-squad
- k8s.io/apiserver v0.33.2 // @grafana/grafana-app-platform-squad
- k8s.io/client-go v0.33.2 // @grafana/grafana-app-platform-squad
- k8s.io/component-base v0.33.2 // @grafana/grafana-app-platform-squad
+ k8s.io/api v0.33.3 // @grafana/grafana-app-platform-squad
+ k8s.io/apimachinery v0.33.3 // @grafana/grafana-app-platform-squad
+ k8s.io/apiserver v0.33.3 // @grafana/grafana-app-platform-squad
+ k8s.io/client-go v0.33.3 // @grafana/grafana-app-platform-squad
+ k8s.io/component-base v0.33.3 // @grafana/grafana-app-platform-squad
k8s.io/klog/v2 v2.130.1 // @grafana/grafana-app-platform-squad
- k8s.io/kube-aggregator v0.33.1 // @grafana/grafana-app-platform-squad
+ k8s.io/kube-aggregator v0.33.3 // @grafana/grafana-app-platform-squad
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // @grafana/grafana-app-platform-squad
- k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // @grafana/partner-datasources
+ k8s.io/utils v0.0.0-20241210054802-24370beab758 // @grafana/partner-datasources
pgregory.net/rapid v1.2.0 // @grafana/grafana-operator-experience-squad
sigs.k8s.io/randfill v1.0.0 // @grafana/grafana-app-platform-squad
sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // @grafana-app-platform-squad
@@ -230,7 +230,7 @@ require (
require (
github.com/grafana/grafana/apps/advisor v0.0.0-20250627191313-2f1a6ae1712b // @grafana/plugins-platform-backend
github.com/grafana/grafana/apps/alerting/notifications v0.0.0-20250627191313-2f1a6ae1712b // @grafana/alerting-backend
- github.com/grafana/grafana/apps/dashboard v0.0.0-20250716154214-974103c6fa20 // @grafana/grafana-app-platform-squad @grafana/dashboards-squad
+ github.com/grafana/grafana/apps/dashboard v0.0.0-20250716132114-6fd75ebc5441 // @grafana/grafana-app-platform-squad @grafana/dashboards-squad
github.com/grafana/grafana/apps/folder v0.0.0-20250627191313-2f1a6ae1712b // @grafana/grafana-search-and-storage
github.com/grafana/grafana/apps/iam v0.0.0-20250627191313-2f1a6ae1712b // @grafana/identity-access-team
github.com/grafana/grafana/apps/investigations v0.0.0-20250627191313-2f1a6ae1712b // @fcjack @matryer
@@ -361,7 +361,7 @@ require (
github.com/dolthub/maphash v0.1.0 // indirect
github.com/edsrzf/mmap-go v1.2.0 // indirect
github.com/elazarl/goproxy v1.7.2 // indirect
- github.com/emicklei/go-restful/v3 v3.11.0 // indirect
+ github.com/emicklei/go-restful/v3 v3.12.1 // indirect
github.com/emicklei/proto v1.13.2 // indirect
github.com/emirpasic/gods v1.18.1 // indirect
github.com/envoyproxy/go-control-plane/envoy v1.32.4 // indirect
@@ -372,7 +372,7 @@ require (
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
github.com/gammazero/deque v0.2.1 // indirect
github.com/go-asn1-ber/asn1-ber v1.5.4 // indirect
- github.com/go-logr/logr v1.4.2 // indirect
+ github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/analysis v0.23.0 // indirect
github.com/go-openapi/errors v0.22.0 // indirect
@@ -448,7 +448,7 @@ require (
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect
github.com/lestrrat-go/strftime v1.0.4 // indirect
github.com/magefile/mage v1.15.0 // indirect
- github.com/mailru/easyjson v0.7.7 // indirect
+ github.com/mailru/easyjson v0.9.0 // indirect
github.com/matryer/is v1.4.1 // indirect
github.com/mattbaird/jsonpatch v0.0.0-20240118010651-0ba75a80ca38 // indirect
github.com/mattermost/xml-roundtrip-validator v0.1.0 // indirect
@@ -556,20 +556,21 @@ require (
go.opentelemetry.io/contrib/exporters/autoexport v0.61.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.36.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0 // indirect
- go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.36.0 // indirect
- go.opentelemetry.io/otel/exporters/prometheus v0.58.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0 // indirect
+ go.opentelemetry.io/otel/exporters/prometheus v0.59.0 // indirect
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.12.2 // indirect
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 // indirect
- go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.36.0 // indirect
+ go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0 // indirect
go.opentelemetry.io/otel/log v0.12.2 // indirect
- go.opentelemetry.io/otel/metric v1.36.0 // indirect
+ go.opentelemetry.io/otel/metric v1.37.0 // indirect
go.opentelemetry.io/otel/sdk/log v0.12.2 // indirect
- go.opentelemetry.io/otel/sdk/metric v1.36.0 // indirect
- go.opentelemetry.io/proto/otlp v1.6.0 // indirect
+ go.opentelemetry.io/otel/sdk/metric v1.37.0 // indirect
+ go.opentelemetry.io/proto/otlp v1.7.0 // indirect
go.uber.org/mock v0.5.2 // indirect
go.uber.org/multierr v1.11.0 // indirect
+ go.yaml.in/yaml/v2 v2.4.2 // indirect
go4.org/netipx v0.0.0-20230125063823-8449b0a6169f // indirect
golang.org/x/sys v0.33.0 // indirect
golang.org/x/term v0.32.0 // indirect
@@ -586,14 +587,14 @@ require (
gopkg.in/src-d/go-errors.v1 v1.0.0 // indirect
gopkg.in/telebot.v3 v3.2.1 // indirect
k8s.io/apiextensions-apiserver v0.33.2 // indirect
- k8s.io/kms v0.33.2 // indirect
+ k8s.io/kms v0.33.3 // indirect
modernc.org/libc v1.65.0 // indirect
modernc.org/mathutil v1.7.1 // indirect
modernc.org/memory v1.10.0 // indirect
modernc.org/sqlite v1.37.0 // indirect
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 // indirect
- sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect
- sigs.k8s.io/yaml v1.4.0 // indirect
+ sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect
+ sigs.k8s.io/yaml v1.5.0 // indirect
)
// Use fork of crewjam/saml with fixes for some issues until changes get merged into upstream
diff --git a/go.sum b/go.sum
index f13cfc2dc32..65c00e3ac6b 100644
--- a/go.sum
+++ b/go.sum
@@ -736,8 +736,8 @@ github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy86
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.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
-github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4=
-github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
+github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
+github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
github.com/Masterminds/sprig/v3 v3.2.1/go.mod h1:UoaO7Yp8KlPnJIYWTFkMaqPUYKTfGFPhxNuwnnxkKlk=
github.com/Masterminds/sprig/v3 v3.3.0 h1:mQh0Yrg1XPo6vjYXgtf5OtijNAKJRNcTdOOGZe3tPhs=
github.com/Masterminds/sprig/v3 v3.3.0/go.mod h1:Zy1iXRYNqNLUolqCpL4uhk6SHUMAOSCzdgBfDb35Lz0=
@@ -1131,8 +1131,8 @@ github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkg
github.com/elazarl/goproxy v1.7.2 h1:Y2o6urb7Eule09PjlhQRGNsqRfPmYI3KKQLFpCAV3+o=
github.com/elazarl/goproxy v1.7.2/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE=
github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs=
-github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g=
-github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
+github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU=
+github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc=
github.com/emicklei/proto v1.13.2 h1:z/etSFO3uyXeuEsVPzfl56WNgzcvIr42aQazXaQmFZY=
github.com/emicklei/proto v1.13.2/go.mod h1:rn1FgRS/FANiZdD2djyH7TMA9jdRDcYQ9IEN9yvjX0A=
github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc=
@@ -1235,8 +1235,9 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
-github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
+github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ=
@@ -1573,8 +1574,8 @@ github.com/gorilla/sessions v1.2.1 h1:DHd3rPN5lE3Ts3D8rKkQ8x/0kqfeNmBAaiSi+o7Fsg
github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo=
github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA=
-github.com/grafana/alerting v0.0.0-20250716142237-8308539caa27 h1:buoRKSKUO2QGJ16j2mY8T8S0KTjwB9uLtBrNvbYjkmM=
-github.com/grafana/alerting v0.0.0-20250716142237-8308539caa27/go.mod h1:gtR7agmxVfJOmNKV/n2ZULgOYTYNL+PDKYB5N48tQ7Q=
+github.com/grafana/alerting v0.0.0-20250725130805-615c8286e14b h1:mfUAq/N+mS82EcE35hDXWtfVY7UhTjzZxzssvFt9tvQ=
+github.com/grafana/alerting v0.0.0-20250725130805-615c8286e14b/go.mod h1:VKxaR93Gff0ZlO2sPcdPVob1a/UzArFEW5zx3Bpyhls=
github.com/grafana/authlib v0.0.0-20250710201142-9542f2f28d43 h1:vVPT0i5Y1vI6qzecYStV2yk7cHKrC3Pc7AgvwT5KydQ=
github.com/grafana/authlib v0.0.0-20250710201142-9542f2f28d43/go.mod h1:1fWkOiL+m32NBgRHZtlZGz2ji868tPZACYbqP3nBRJI=
github.com/grafana/authlib/types v0.0.0-20250710201142-9542f2f28d43 h1:NlkGMnVi/oUn6Cr90QbJYpQJ4FnjyAIG9Ex5GtTZIzw=
@@ -1593,16 +1594,16 @@ github.com/grafana/gomemcache v0.0.0-20250318131618-74242eea118d h1:oXRJlb9UjVsl
github.com/grafana/gomemcache v0.0.0-20250318131618-74242eea118d/go.mod h1:j/s0jkda4UXTemDs7Pgw/vMT06alWc42CHisvYac0qw=
github.com/grafana/grafana-api-golang-client v0.27.0 h1:zIwMXcbCB4n588i3O2N6HfNcQogCNTd/vPkEXTr7zX8=
github.com/grafana/grafana-api-golang-client v0.27.0/go.mod h1:uNLZEmgKtTjHBtCQMwNn3qsx2mpMb8zU+7T4Xv3NR9Y=
-github.com/grafana/grafana-app-sdk v0.39.2 h1:ymfr+1318t+JC9U2OYrzVpGmNG/aJONUmFFu/G98Xh8=
-github.com/grafana/grafana-app-sdk v0.39.2/go.mod h1:t0m6q561lpoHQCixS9LUHFUhUzDClzNtm7BH60gHVSY=
-github.com/grafana/grafana-app-sdk/logging v0.39.1 h1:lI5rbrheuwVPuyIM6LIuEYOCSpgmXahfKtqeMyhbGPU=
-github.com/grafana/grafana-app-sdk/logging v0.39.1/go.mod h1:WhDENSnaGHtyVVwZGVnAR7YLvh2xlLDYR3D7E6h7XVk=
+github.com/grafana/grafana-app-sdk v0.40.0 h1:KilbCFMYox2cnIi1W6ql7W+n9kms/NvWlBPM1m4Q4mg=
+github.com/grafana/grafana-app-sdk v0.40.0/go.mod h1:fn943JEM0CR3mY/Gd3816MUcpob5xnKc8MoojnbMjYY=
+github.com/grafana/grafana-app-sdk/logging v0.39.3 h1:mMrcYahnoRu7blKyL/ZVcgv7WCiI2CqxODYh8tBFUgY=
+github.com/grafana/grafana-app-sdk/logging v0.39.3/go.mod h1:otUD9XpJD7A5sCLb8mcs9hIXGdeV6lnhzVwe747g4RU=
github.com/grafana/grafana-aws-sdk v1.0.4 h1:D14UAehsOqpjliHmHzveRQ1p43KCsMzdmb7GovWj+SY=
github.com/grafana/grafana-aws-sdk v1.0.4/go.mod h1:hO7q7yWV+t6dmiyJjMa3IbuYnYkBua+G/IAlOPVIYKE=
github.com/grafana/grafana-azure-sdk-go/v2 v2.1.6 h1:OfCkitCuomzZKW1WYHrG8MxKwtMhALb7jqoj+487eTg=
github.com/grafana/grafana-azure-sdk-go/v2 v2.1.6/go.mod h1:V7y2BmsWxS3A9Ohebwn4OiSfJJqi//4JQydQ8fHTduo=
-github.com/grafana/grafana-cloud-migration-snapshot v1.6.0 h1:S4kHwr//AqhtL9xHBtz1gqVgZQeCRGTxjgsRBAkpjKY=
-github.com/grafana/grafana-cloud-migration-snapshot v1.6.0/go.mod h1:rWNhyxYkgiXgV7xZ4yOQzMV08yikO8L8S8M5KNoQNpA=
+github.com/grafana/grafana-cloud-migration-snapshot v1.9.0 h1:JOzchPgptwJdruYoed7x28lFDwhzs7kssResYsnC0iI=
+github.com/grafana/grafana-cloud-migration-snapshot v1.9.0/go.mod h1:nOHgq4Oa829qmBKA5KIXw5Ipo3rhLs0d6A8UI9Nw8Zk=
github.com/grafana/grafana-google-sdk-go v0.4.1 h1:QdHmgDzlV3RzBTvIxd+WuxER1+afnFzUmEivbwDo27E=
github.com/grafana/grafana-google-sdk-go v0.4.1/go.mod h1:U73+w9DlbEtUonhQUzERwlXnzWTtfRoyrtKH8d3VY40=
github.com/grafana/grafana-openapi-client-go v0.0.0-20231213163343-bd475d63fb79 h1:r+mU5bGMzcXCRVAuOrTn54S80qbfVkvTdUJZfSfTNbs=
@@ -1613,8 +1614,8 @@ github.com/grafana/grafana/apps/advisor v0.0.0-20250627191313-2f1a6ae1712b h1:8o
github.com/grafana/grafana/apps/advisor v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:q+h3HbmqU/PposW6lq8cMle1v8vuyX1LCMrGzbabHxc=
github.com/grafana/grafana/apps/alerting/notifications v0.0.0-20250627191313-2f1a6ae1712b h1:jr+C3epmjhd5Yyob4P1Z/dPaW4LRTkU5UJLXsI4eaeM=
github.com/grafana/grafana/apps/alerting/notifications v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:WpI7TCck4P2wKTO2WJLBRcfOWvUGvTdxYu3QqS3z7jM=
-github.com/grafana/grafana/apps/dashboard v0.0.0-20250716154214-974103c6fa20 h1:2aeZOXOdJID5BbrUtBWG+yGUU4wDXkqwsq9drSalrDE=
-github.com/grafana/grafana/apps/dashboard v0.0.0-20250716154214-974103c6fa20/go.mod h1:1XWiRSVuDQiayapHhQiDc4S4e9GzEZgg/3GeNCuDgn4=
+github.com/grafana/grafana/apps/dashboard v0.0.0-20250716132114-6fd75ebc5441 h1:+TSbaxCXBZrKkdROWBzdWna8uStE1f9LYd7GiqjVfz8=
+github.com/grafana/grafana/apps/dashboard v0.0.0-20250716132114-6fd75ebc5441/go.mod h1:1XWiRSVuDQiayapHhQiDc4S4e9GzEZgg/3GeNCuDgn4=
github.com/grafana/grafana/apps/folder v0.0.0-20250627191313-2f1a6ae1712b h1:31MwoIKKT9Ay0ZjbT4lkfcPijiWogUWzXs2EjrCgodI=
github.com/grafana/grafana/apps/folder v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:dLtYBp1pza5HYalezNvzlP8JDeKrZ5BKTonDgEOE0NY=
github.com/grafana/grafana/apps/iam v0.0.0-20250627191313-2f1a6ae1712b h1:NV8v9xdM/pzjjy+1cLqUseia3bYcvQGh88vZdMW/jA0=
@@ -1641,8 +1642,8 @@ github.com/grafana/loki/pkg/push v0.0.0-20231124142027-e52380921608 h1:ZYk42718k
github.com/grafana/loki/pkg/push v0.0.0-20231124142027-e52380921608/go.mod h1:f3JSoxBTPXX5ec4FxxeC19nTBSxoTz+cBgS3cYLMcr0=
github.com/grafana/loki/v3 v3.2.1 h1:VB7u+KHfvL5aHAxgoVBvz5wVhsdGuqKC7uuOFOOe7jw=
github.com/grafana/loki/v3 v3.2.1/go.mod h1:WvdLl6wOS+yahaeQY+xhD2m2XzkHDfKr5FZaX7D/X2Y=
-github.com/grafana/nanogit v0.0.0-20250709085038-55508a6a9f40 h1:wsIgOI4Ou1o/UtxtJlemLufpVBpMdcXVJxedk0wLoCM=
-github.com/grafana/nanogit v0.0.0-20250709085038-55508a6a9f40/go.mod h1:ToqLjIdvV3AZQa3K6e5m9hy/nsGaUByc2dWQlctB9iA=
+github.com/grafana/nanogit v0.0.0-20250723104447-68f58f5ecec0 h1:cS0SlJGIlZbmDLctNj5vIYGemrJDLy25wwoiIyZWVN8=
+github.com/grafana/nanogit v0.0.0-20250723104447-68f58f5ecec0/go.mod h1:ToqLjIdvV3AZQa3K6e5m9hy/nsGaUByc2dWQlctB9iA=
github.com/grafana/otel-profiling-go v0.5.1 h1:stVPKAFZSa7eGiqbYuG25VcqYksR6iWvF3YH66t4qL8=
github.com/grafana/otel-profiling-go v0.5.1/go.mod h1:ftN/t5A/4gQI19/8MoWurBEtC6gFw8Dns1sJZ9W4Tls=
github.com/grafana/prometheus-alertmanager v0.25.1-0.20250620093340-be61a673dee6 h1:oJnbhG6ZNy10AjsgNeAtAKeGHogIGOMfAsBH6fYYa5M=
@@ -1674,8 +1675,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90=
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4=
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0=
@@ -1941,8 +1942,9 @@ github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN
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.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
+github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4=
+github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU=
github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA=
github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ=
github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=
@@ -2233,8 +2235,8 @@ github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGy
github.com/prometheus/common v0.48.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc=
github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8=
github.com/prometheus/common v0.60.1/go.mod h1:h0LYf1R1deLSKtD4Vdg8gy4RuOvENW2J/h19V5NADQw=
-github.com/prometheus/common v0.64.0 h1:pdZeA+g617P7oGv1CzdTzyeShxAGrTBsolKNOLQPGO4=
-github.com/prometheus/common v0.64.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
+github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE=
+github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
github.com/prometheus/common/assets v0.2.0/go.mod h1:D17UVUE12bHbim7HzwUvtqm6gwBEaDQ0F+hIGbFbccI=
github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4=
github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI=
@@ -2564,8 +2566,8 @@ go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.61.0 h1:lREC4C0ilyP4WibDhQ7Gg2ygAQFP8oR07Fst/5cafwI=
go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.61.0/go.mod h1:HfvuU0kW9HewH14VCOLImqKvUgONodURG7Alj/IrnGI=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.55.0/go.mod h1:DQAwmETtZV00skUwgD6+0U89g80NKsJE3DCKeLLPQMI=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0 h1:Hf9xI/XLML9ElpiHVDNwvqI0hIFlzV8dgIr35kV1kRU=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.62.0/go.mod h1:NfchwuyNoMcZ5MLHwPrODwUF1HWCXWrL31s8gSAdIKY=
go.opentelemetry.io/contrib/propagators/jaeger v1.36.0 h1:SoCgXYF4ISDtNyfLUzsGDaaudZVTx2yJhOyBO0+/GYk=
go.opentelemetry.io/contrib/propagators/jaeger v1.36.0/go.mod h1:VHu48l0YTRKSObdPQ+Sb8xMZvdnJlN7yhHuHoPgNqHM=
go.opentelemetry.io/contrib/samplers/jaegerremote v0.30.0 h1:bQ1Gvah4Sp8z7epSkgJaNTuZm7sutfA6Fji2/7cKFMc=
@@ -2573,59 +2575,59 @@ go.opentelemetry.io/contrib/samplers/jaegerremote v0.30.0/go.mod h1:9b8Q9rH52NgY
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.30.0/go.mod h1:tFw4Br9b7fOS+uEao81PJjVMjW/5fvNCbpsDIXqP0pc=
-go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg=
-go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
+go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
+go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4=
go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI=
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2 h1:06ZeJRe5BnYXceSM9Vya83XXVaNGe3H1QqsvqRANQq8=
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.12.2/go.mod h1:DvPtKE63knkDVP88qpatBj81JxN+w1bqfVbsbCbj1WY=
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2 h1:tPLwQlXbJ8NSOfZc4OkgU5h2A38M4c9kfHSVc4PFQGs=
go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.12.2/go.mod h1:QTnxBwT/1rBIgAG1goq6xMydfYOBKU6KTiYF4fp5zL8=
-go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.36.0 h1:zwdo1gS2eH26Rg+CoqVQpEK1h8gvt5qyU5Kk5Bixvow=
-go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.36.0/go.mod h1:rUKCPscaRWWcqGT6HnEmYrK+YNe5+Sw64xgQTOJ5b30=
-go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0 h1:gAU726w9J8fwr4qRDqu1GYMNNs4gXrU+Pv20/N1UpB4=
-go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0/go.mod h1:RboSDkp7N292rgu+T0MgVt2qgFGu6qa1RpZDOtpL76w=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0 h1:dNzwXjZKpMpE2JhmO+9HsPl42NIXFIFSUSSs0fiqra0=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.36.0/go.mod h1:90PoxvaEB5n6AOdZvi+yWJQoE95U8Dhhw2bSyRqnTD0=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0 h1:JgtbA0xkWHnTmYk7YusopJFX6uleBmAuZ8n05NEh8nQ=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.36.0/go.mod h1:179AK5aar5R3eS9FucPy6rggvU0g52cvKId8pv4+v0c=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.36.0 h1:nRVXXvf78e00EwY6Wp0YII8ww2JVWshZ20HfTlE11AM=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.36.0/go.mod h1:r49hO7CgrxY9Voaj3Xe8pANWtr0Oq916d0XAmOoCZAQ=
-go.opentelemetry.io/otel/exporters/prometheus v0.58.0 h1:CJAxWKFIqdBennqxJyOgnt5LqkeFRT+Mz3Yjz3hL+h8=
-go.opentelemetry.io/otel/exporters/prometheus v0.58.0/go.mod h1:7qo/4CLI+zYSNbv0GMNquzuss2FVZo3OYrGh96n4HNc=
+go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0 h1:zG8GlgXCJQd5BU98C0hZnBbElszTmUgCNCfYneaDL0A=
+go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.37.0/go.mod h1:hOfBCz8kv/wuq73Mx2H2QnWokh/kHZxkh6SNF2bdKtw=
+go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.37.0 h1:9PgnL3QNlj10uGxExowIDIZu66aVBwWhXmbOp1pa6RA=
+go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.37.0/go.mod h1:0ineDcLELf6JmKfuo0wvvhAVMuxWFYvkTin2iV4ydPQ=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0 h1:bDMKF3RUSxshZ5OjOTi8rsHGaPKsAt76FaqgvIUySLc=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0/go.mod h1:dDT67G/IkA46Mr2l9Uj7HsQVwsjASyV9SjGofsiUZDA=
+go.opentelemetry.io/otel/exporters/prometheus v0.59.0 h1:HHf+wKS6o5++XZhS98wvILrLVgHxjA/AMjqHKes+uzo=
+go.opentelemetry.io/otel/exporters/prometheus v0.59.0/go.mod h1:R8GpRXTZrqvXHDEGVH5bF6+JqAZcK8PjJcZ5nGhEWiE=
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.12.2 h1:12vMqzLLNZtXuXbJhSENRg+Vvx+ynNilV8twBLBsXMY=
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.12.2/go.mod h1:ZccPZoPOoq8x3Trik/fCsba7DEYDUnN6yX79pgp2BUQ=
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0 h1:rixTyDGXFxRy1xzhKrotaHy3/KXdPhlWARrCgK+eqUY=
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.36.0/go.mod h1:dowW6UsM9MKbJq5JTz2AMVp3/5iW5I/TStsk8S+CfHw=
-go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.36.0 h1:G8Xec/SgZQricwWBJF/mHZc7A02YHedfFDENwJEdRA0=
-go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.36.0/go.mod h1:PD57idA/AiFD5aqoxGxCvT/ILJPeHy3MjqU/NS7KogY=
+go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0 h1:SNhVp/9q4Go/XHBkQ1/d5u9P/U+L1yaGPoi0x+mStaI=
+go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.37.0/go.mod h1:tx8OOlGH6R4kLV67YaYO44GFXloEjGPZuMjEkaaqIp4=
go.opentelemetry.io/otel/log v0.12.2 h1:yob9JVHn2ZY24byZeaXpTVoPS6l+UrrxmxmPKohXTwc=
go.opentelemetry.io/otel/log v0.12.2/go.mod h1:ShIItIxSYxufUMt+1H5a2wbckGli3/iCfuEbVZi/98E=
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.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ=
-go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE=
-go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs=
+go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
+go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
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.36.0 h1:b6SYIuLRs88ztox4EyrvRti80uXIFy+Sqzoh9kFULbs=
-go.opentelemetry.io/otel/sdk v1.36.0/go.mod h1:+lC+mTgD+MUWfjJubi2vvXWcVxyr9rmlshZni72pXeY=
+go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
+go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
go.opentelemetry.io/otel/sdk/log v0.12.2 h1:yNoETvTByVKi7wHvYS6HMcZrN5hFLD7I++1xIZ/k6W0=
go.opentelemetry.io/otel/sdk/log v0.12.2/go.mod h1:DcpdmUXHJgSqN/dh+XMWa7Vf89u9ap0/AAk/XGLnEzY=
go.opentelemetry.io/otel/sdk/log/logtest v0.0.0-20250521073539-a85ae98dcedc h1:uqxdywfHqqCl6LmZzI3pUnXT1RGFYyUgxj0AkWPFxi0=
go.opentelemetry.io/otel/sdk/log/logtest v0.0.0-20250521073539-a85ae98dcedc/go.mod h1:TY/N/FT7dmFrP/r5ym3g0yysP1DefqGpAZr4f82P0dE=
-go.opentelemetry.io/otel/sdk/metric v1.36.0 h1:r0ntwwGosWGaa0CrSt8cuNuTcccMXERFwHX4dThiPis=
-go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4=
+go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
+go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
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.30.0/go.mod h1:5EyKqTzzmyqB9bwtCCq6pDLktPK6fmGf/Dph+8VI02o=
-go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w=
-go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA=
+go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
+go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
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=
-go.opentelemetry.io/proto/otlp v1.6.0 h1:jQjP+AQyTf+Fe7OKj/MfkDrmK4MNVtw2NpXsf9fefDI=
-go.opentelemetry.io/proto/otlp v1.6.0/go.mod h1:cicgGehlFuNdgZkcALOCh3VE6K/u2tAjzlRhDwmVpZc=
+go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os=
+go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
@@ -2641,6 +2643,10 @@ go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo=
go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
+go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
+go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
+go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE=
+go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI=
go4.org/netipx v0.0.0-20230125063823-8449b0a6169f h1:ketMxHg+vWm3yccyYiq+uK8D3fRmna2Fcj+awpQp84s=
go4.org/netipx v0.0.0-20230125063823-8449b0a6169f/go.mod h1:tgPU4N2u9RByaTN3NC2p9xOzyFpte4jYwsIIRF7XlSc=
gocloud.dev v0.42.0 h1:qzG+9ItUL3RPB62/Amugws28n+4vGZXEoJEAMfjutzw=
@@ -2904,8 +2910,8 @@ golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
-golang.org/x/sync v0.15.0 h1:KWH3jNZsfyT6xfAfKiz6MRNmd46ByHDYaZ7KSkCtdW8=
-golang.org/x/sync v0.15.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
+golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
+golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/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=
@@ -3556,19 +3562,19 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9
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=
k8s.io/api v0.0.0-20190813020757-36bff7324fb7/go.mod h1:3Iy+myeAORNCLgjd/Xu9ebwN7Vh59Bw0vh9jhoX+V58=
-k8s.io/api v0.33.2 h1:YgwIS5jKfA+BZg//OQhkJNIfie/kmRsO0BmNaVSimvY=
-k8s.io/api v0.33.2/go.mod h1:fhrbphQJSM2cXzCWgqU29xLDuks4mu7ti9vveEnpSXs=
+k8s.io/api v0.33.3 h1:SRd5t//hhkI1buzxb288fy2xvjubstenEKL9K51KBI8=
+k8s.io/api v0.33.3/go.mod h1:01Y/iLUjNBM3TAvypct7DIj0M0NIZc+PzAHCIo0CYGE=
k8s.io/apiextensions-apiserver v0.33.2 h1:6gnkIbngnaUflR3XwE1mCefN3YS8yTD631JXQhsU6M8=
k8s.io/apiextensions-apiserver v0.33.2/go.mod h1:IvVanieYsEHJImTKXGP6XCOjTwv2LUMos0YWc9O+QP8=
k8s.io/apimachinery v0.0.0-20190809020650-423f5d784010/go.mod h1:Waf/xTS2FGRrgXCkO5FP3XxTOWh0qLf2QhL1qFZZ/R8=
-k8s.io/apimachinery v0.33.2 h1:IHFVhqg59mb8PJWTLi8m1mAoepkUNYmptHsV+Z1m5jY=
-k8s.io/apimachinery v0.33.2/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
-k8s.io/apiserver v0.33.2 h1:KGTRbxn2wJagJowo29kKBp4TchpO1DRO3g+dB/KOJN4=
-k8s.io/apiserver v0.33.2/go.mod h1:9qday04wEAMLPWWo9AwqCZSiIn3OYSZacDyu/AcoM/M=
-k8s.io/client-go v0.33.2 h1:z8CIcc0P581x/J1ZYf4CNzRKxRvQAwoAolYPbtQes+E=
-k8s.io/client-go v0.33.2/go.mod h1:9mCgT4wROvL948w6f6ArJNb7yQd7QsvqavDeZHvNmHo=
-k8s.io/component-base v0.33.2 h1:sCCsn9s/dG3ZrQTX/Us0/Sx2R0G5kwa0wbZFYoVp/+0=
-k8s.io/component-base v0.33.2/go.mod h1:/41uw9wKzuelhN+u+/C59ixxf4tYQKW7p32ddkYNe2k=
+k8s.io/apimachinery v0.33.3 h1:4ZSrmNa0c/ZpZJhAgRdcsFcZOw1PQU1bALVQ0B3I5LA=
+k8s.io/apimachinery v0.33.3/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM=
+k8s.io/apiserver v0.33.3 h1:Wv0hGc+QFdMJB4ZSiHrCgN3zL3QRatu56+rpccKC3J4=
+k8s.io/apiserver v0.33.3/go.mod h1:05632ifFEe6TxwjdAIrwINHWE2hLwyADFk5mBsQa15E=
+k8s.io/client-go v0.33.3 h1:M5AfDnKfYmVJif92ngN532gFqakcGi6RvaOF16efrpA=
+k8s.io/client-go v0.33.3/go.mod h1:luqKBQggEf3shbxHY4uVENAxrDISLOarxpTKMiUuujg=
+k8s.io/component-base v0.33.3 h1:mlAuyJqyPlKZM7FyaoM/LcunZaaY353RXiOd2+B5tGA=
+k8s.io/component-base v0.33.3/go.mod h1:ktBVsBzkI3imDuxYXmVxZ2zxJnYTZ4HAsVj9iF09qp4=
k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0=
k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
@@ -3576,17 +3582,17 @@ k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk=
k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk=
k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE=
-k8s.io/kms v0.33.2 h1:GFwNXX4CZGQCg9DPOaJi1/+iKidCtB9/OIAGdzRo8FI=
-k8s.io/kms v0.33.2/go.mod h1:C1I8mjFFBNzfUZXYt9FZVJ8MJl7ynFbGgZFbBzkBJ3E=
-k8s.io/kube-aggregator v0.33.1 h1:PigQUqAvd6Y4hBjQAqhKz3lEJC2VHLL4bSOEuS06a40=
-k8s.io/kube-aggregator v0.33.1/go.mod h1:16/wlU5Lj7hNJSv7JSu5FLvxyrgiJVLCHzfVoECAsuI=
+k8s.io/kms v0.33.3 h1:7cQWC+GSH211NgY8LRKjBXNtkzra5SkpYzeZrOt5D+8=
+k8s.io/kms v0.33.3/go.mod h1:C1I8mjFFBNzfUZXYt9FZVJ8MJl7ynFbGgZFbBzkBJ3E=
+k8s.io/kube-aggregator v0.33.3 h1:Pa6hQpKJMX0p0D2wwcxXJgu02++gYcGWXoW1z1ZJDfo=
+k8s.io/kube-aggregator v0.33.3/go.mod h1:hwvkUoQ8q6gv0+SgNnlmQ3eUue1zHhJKTHsX7BwxwSE=
k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4=
k8s.io/kube-openapi v0.0.0-20190722073852-5e22f3d471e6/go.mod h1:RZvgC8MSN6DjiMV6oIfEE9pDL9CYXokkfaCKZeHm3nc=
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4=
k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8=
k8s.io/utils v0.0.0-20190809000727-6c36bc71fc4a/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro=
-k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
+k8s.io/utils v0.0.0-20241210054802-24370beab758 h1:sdbE21q2nlQtFh65saZY+rRM6x6aJJI8IUa1AmH/qa0=
+k8s.io/utils v0.0.0-20241210054802-24370beab758/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
lukechampine.com/uint128 v1.1.1/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI=
@@ -3653,8 +3659,8 @@ rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 h1:jpcvIRr3GLoUoEKRkHKSmGjxb6lWwrBlJsXc+eUYQHM=
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8=
-sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE=
+sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg=
sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU=
sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY=
@@ -3663,7 +3669,8 @@ sigs.k8s.io/structured-merge-diff/v4 v4.6.0 h1:IUA9nvMmnKWcj5jl84xn+T5MnlZKThmUW
sigs.k8s.io/structured-merge-diff/v4 v4.6.0/go.mod h1:dDy58f92j70zLsuZVuUX5Wp9vtxXpaZnkPGWeqDfCps=
sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o=
sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc=
-sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
+sigs.k8s.io/yaml v1.5.0 h1:M10b2U7aEUY6hRtU870n2VTPgR5RZiL/I6Lcc2F4NUQ=
+sigs.k8s.io/yaml v1.5.0/go.mod h1:wZs27Rbxoai4C0f8/9urLZtZtF3avA3gKvGyPdDqTO4=
xorm.io/builder v0.3.6 h1:ha28mQ2M+TFx96Hxo+iq6tQgnkC9IZkM6D8w9sKHHF8=
xorm.io/builder v0.3.6/go.mod h1:LEFAPISnRzG+zxaxj2vPicRwz67BdhFreKg8yv8/TgU=
diff --git a/go.work b/go.work
index 8d1fff1ed6a..2735423d372 100644
--- a/go.work
+++ b/go.work
@@ -1,4 +1,4 @@
-go 1.24.4
+go 1.24.5
// The `skip:golangci-lint` comment tag is used to exclude the package from the `golangci-lint` GitHub Action.
// The module at the root of the repo (`.`) is excluded because ./pkg/... is included manually in the `golangci-lint` configuration.
@@ -24,6 +24,6 @@ use (
./pkg/semconv
)
-replace github.com/prometheus/alertmanager => github.com/grafana/prometheus-alertmanager v0.25.1-0.20250604130045-92c8f6389b36
+replace github.com/prometheus/alertmanager => github.com/grafana/prometheus-alertmanager v0.25.1-0.20250620093340-be61a673dee6
replace github.com/crewjam/saml => github.com/grafana/saml v0.4.15-0.20240917091248-ae3bbdad8a56
diff --git a/go.work.sum b/go.work.sum
index 45af5346b64..4c6414c6e58 100644
--- a/go.work.sum
+++ b/go.work.sum
@@ -20,6 +20,8 @@ cloud.google.com/go v0.112.2/go.mod h1:iEqjp//KquGIJV/m+Pk3xecgKNhV+ry+vVTsy4TbD
cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs70U=
cloud.google.com/go v0.118.1/go.mod h1:CFO4UPEPi8oV21xoezZCrd3d81K4fFkDTEJu4R8K+9M=
cloud.google.com/go v0.118.3/go.mod h1:Lhs3YLnBlwJ4KA6nuObNMZ/fCbOQBPuWKPoE0Wa/9Vc=
+cloud.google.com/go v0.120.0/go.mod h1:/beW32s8/pGRuj4IILWQNd4uuebeT4dkOhKmkfit64Q=
+cloud.google.com/go v0.121.0/go.mod h1:rS7Kytwheu/y9buoDmu5EIpMMCI4Mb8ND4aeN4Vwj7Q=
cloud.google.com/go/accessapproval v1.8.3 h1:axlU03FRiXDNupsmPG7LKzuS4Enk1gf598M62lWVB74=
cloud.google.com/go/accessapproval v1.8.3/go.mod h1:3speETyAv63TDrDmo5lIkpVueFkQcQchkiw/TAMbBo4=
cloud.google.com/go/accessapproval v1.8.6 h1:UkmDPCKvj24bkGVrvgJPcgSDkmIPw/bAmOiDb9avOiE=
@@ -280,6 +282,7 @@ cloud.google.com/go/lifesciences v0.10.6/go.mod h1:1nnZwaZcBThDujs9wXzECnd1S5d+U
cloud.google.com/go/longrunning v0.5.6/go.mod h1:vUaDrWYOMKRuhiv6JBnn49YxCPz2Ayn9GqyjaBT8/mA=
cloud.google.com/go/longrunning v0.6.2/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI=
cloud.google.com/go/longrunning v0.6.4/go.mod h1:ttZpLCe6e7EXvn9OxpBRx7kZEB0efv8yBO6YnVMfhJs=
+cloud.google.com/go/longrunning v0.6.6/go.mod h1:hyeGJUrPHcx0u2Uu1UFSoYZLn4lkMrccJig0t4FI7yw=
cloud.google.com/go/managedidentities v1.7.3 h1:b9xGs24BIjfyvLgCtJoClOZpPi8d8owPgWe5JEINgaY=
cloud.google.com/go/managedidentities v1.7.3/go.mod h1:H9hO2aMkjlpY+CNnKWRh+WoQiUIDO8457wWzUGsdtLA=
cloud.google.com/go/managedidentities v1.7.6 h1:zrZVWXZJlmHnfpyCrTQIbDBGUBHrcOOvrsjMjoXRxrk=
@@ -302,6 +305,7 @@ cloud.google.com/go/metastore v1.14.7 h1:dLm59AHHZCorveCylj7c2iWhkQsmMIeWTsV+tG/
cloud.google.com/go/metastore v1.14.7/go.mod h1:0dka99KQofeUgdfu+K/Jk1KeT9veWZlxuZdJpZPtuYU=
cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU=
cloud.google.com/go/monitoring v1.22.1/go.mod h1:AuZZXAoN0WWWfsSvET1Cpc4/1D8LXq8KRDU87fMS6XY=
+cloud.google.com/go/monitoring v1.24.0/go.mod h1:Bd1PRK5bmQBQNnuGwHBfUamAV1ys9049oEPHnn4pcsc=
cloud.google.com/go/networkconnectivity v1.16.1 h1:YsVhG71ZC4FkqCP2oCI55x/JeGFyd7738Lt8iNTrzJw=
cloud.google.com/go/networkconnectivity v1.16.1/go.mod h1:GBC1iOLkblcnhcnfRV92j4KzqGBrEI6tT7LP52nZCTk=
cloud.google.com/go/networkconnectivity v1.17.1 h1:RQcG1rZNCNV5Dn3tnINs4TYswDXk2hKH+85eh+JvoWU=
@@ -414,8 +418,6 @@ cloud.google.com/go/shell v1.8.3 h1:mjYgUsOtV3jl9xvDmcvlRRmA64deEPf52zOfuc68b/g=
cloud.google.com/go/shell v1.8.3/go.mod h1:OYcrgWF6JSp/uk76sNTtYFlMD0ho2+Cdzc7U3P/bF54=
cloud.google.com/go/shell v1.8.6 h1:jLWyztGlNWBx55QXBM4HbWvfv7aiRjPzRKTUkZA8dXk=
cloud.google.com/go/shell v1.8.6/go.mod h1:GNbTWf1QA/eEtYa+kWSr+ef/XTCDkUzRpV3JPw0LqSk=
-cloud.google.com/go/spanner v1.76.1 h1:vYbVZuXfnFwvNcvH3lhI2PeUA+kHyqKmLC7mJWaC4Ok=
-cloud.google.com/go/spanner v1.76.1/go.mod h1:YtwoE+zObKY7+ZeDCBtZ2ukM+1/iPaMfUM+KnTh/sx0=
cloud.google.com/go/spanner v1.82.0 h1:w9uO8RqEoBooBLX4nqV1RtgudyU2ZX780KTLRgeVg60=
cloud.google.com/go/spanner v1.82.0/go.mod h1:BzybQHFQ/NqGxvE/M+/iU29xgutJf7Q85/4U9RWMto0=
cloud.google.com/go/speech v1.26.0 h1:qvURtJs7BQzQhbxWxwai0pT79S8KLVKJ/4W8igVkt1Y=
@@ -441,6 +443,7 @@ cloud.google.com/go/tpu v1.8.0 h1:BvMNijOb6Vd46Rr/SR5jWv1MPosOhVsi0UaeAGNjeds=
cloud.google.com/go/tpu v1.8.0/go.mod h1:XyNzyK1xc55WvL5rZEML0Z9/TUHDfnq0uICkQw6rWMo=
cloud.google.com/go/tpu v1.8.3 h1:S4Ptq+yFIPNLEzQ/OQwiIYDNzk5I2vYmhf0SmFQOmWo=
cloud.google.com/go/tpu v1.8.3/go.mod h1:Do6Gq+/Jx6Xs3LcY2WhHyGwKDKVw++9jIJp+X+0rxRE=
+cloud.google.com/go/trace v1.11.3/go.mod h1:pt7zCYiDSQjC9Y2oqCsh9jF4GStB/hmjrYLsxRR27q8=
cloud.google.com/go/translate v1.10.3/go.mod h1:GW0vC1qvPtd3pgtypCv4k4U8B7EdgK9/QEF2aJEUovs=
cloud.google.com/go/translate v1.12.3 h1:XJ7LipYJi80BCgVk2lx1fwc7DIYM6oV2qx1G4IAGQ5w=
cloud.google.com/go/translate v1.12.3/go.mod h1:qINOVpgmgBnY4YTFHdfVO4nLrSBlpvlIyosqpGEgyEg=
@@ -492,13 +495,17 @@ codeberg.org/go-pdf/fpdf v0.10.0/go.mod h1:Y0DGRAdZ0OmnZPvjbMp/1bYxmIPxm0ws4tfoP
contrib.go.opencensus.io/exporter/aws v0.0.0-20230502192102-15967c811cec h1:CSNP8nIEQt4sZEo2sGUiWSmVJ9c5QdyIQvwzZAsn+8Y=
contrib.go.opencensus.io/exporter/aws v0.0.0-20230502192102-15967c811cec/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA=
contrib.go.opencensus.io/exporter/ocagent v0.6.0 h1:Z1n6UAyr0QwM284yUuh5Zd8JlvxUGAhFZcgMJkMPrGM=
+contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d h1:LblfooH1lKOpp1hIhukktmSAxFkqMPFk9KR6iZ0MJNI=
+contrib.go.opencensus.io/exporter/ocagent v0.7.1-0.20200907061046-05415f1de66d/go.mod h1:IshRmMJBhDfFj5Y67nVhMYTTIze91RUeT73ipWKs/GY=
+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.14 h1:zBakwHardp9Jcb8sQHcHpXy/0+JIb1M8KjigCJzx7+4=
contrib.go.opencensus.io/exporter/stackdriver v0.13.14/go.mod h1:5pSSGY0Bhuk7waTHuDf4aQ8D2DrhgETRo9fy6k3Xlzc=
+contrib.go.opencensus.io/exporter/zipkin v0.1.2 h1:YqE293IZrKtqPnpwDPH/lOqTWD/s3Iwabycam74JV3g=
+contrib.go.opencensus.io/exporter/zipkin v0.1.2/go.mod h1:mP5xM3rrgOjpn79MM8fZbj3gsxcuytSqtH0dxSWW1RE=
contrib.go.opencensus.io/integrations/ocsql v0.1.7 h1:G3k7C0/W44zcqkpRSFyjU9f6HZkbwIrL//qqnlqWZ60=
contrib.go.opencensus.io/integrations/ocsql v0.1.7/go.mod h1:8DsSdjz3F+APR+0z0WkU1aRorQCFfRxvqjUUPMbF3fE=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY=
-filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
-filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
gioui.org v0.0.0-20210308172011-57750fc8a0a6 h1:K72hopUosKG3ntOPNG4OzzbuhxGuVf06fa2la1/H/Ho=
git.sr.ht/~sbinet/gg v0.6.0 h1:RIzgkizAk+9r7uPzf/VfbJHBMKUr0F5hRFxTUGMnt38=
git.sr.ht/~sbinet/gg v0.6.0/go.mod h1:uucygbfC9wVPQIfrmwM2et0imr8L7KQWywX0xpFMm94=
@@ -540,8 +547,6 @@ github.com/GoogleCloudPlatform/cloudsql-proxy v1.36.0 h1:kAtNAWwvTt5+iew6baV0kbO
github.com/GoogleCloudPlatform/cloudsql-proxy v1.36.0/go.mod h1:VRKXU8C7Y/aUKjRBTGfw0Ndv4YqNxlB8zAPJJDxbASE=
github.com/GoogleCloudPlatform/cloudsql-proxy v1.37.6 h1:UucmvNRPE75F3KzT68GHhKzOPwttxiFkh1d5LTTywW8=
github.com/GoogleCloudPlatform/cloudsql-proxy v1.37.6/go.mod h1:XGripOBEUAcge8IUWR/NMAB5qO9k82tkbpoewBpyjYQ=
-github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.2 h1:DBjmt6/otSdULyJdVg2BlG0qGZO5tKL4VzOs0jpvw5Q=
-github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.2/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1/go.mod h1:jyqM3eLpJ3IbIFDTKVz2rF9T/xWGW0rIriGwnz8l9Tk=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0/go.mod h1:ZV4VOm0/eHR06JLrXWe09068dHpr3TRpY9Uo7T+anuA=
@@ -558,6 +563,7 @@ github.com/Joker/jade v1.1.3 h1:Qbeh12Vq6BxURXT1qZBRHsDxeURB8ztcL6f3EXSGeHk=
github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM=
github.com/KimMachineGun/automemlimit v0.7.1 h1:QcG/0iCOLChjfUweIMC3YL5Xy9C3VBeNmCZHrZfJMBw=
github.com/KimMachineGun/automemlimit v0.7.1/go.mod h1:QZxpHaGOQoYvFhv/r4u3U0JTC2ZcOwbSr11UZF46UBM=
+github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
github.com/MicahParks/keyfunc/v2 v2.1.0 h1:6ZXKb9Rp6qp1bDbJefnG7cTH8yMN1IC/4nf+GVjO99k=
github.com/MicahParks/keyfunc/v2 v2.1.0/go.mod h1:rW42fi+xgLJ2FRRXAfNx9ZA8WpD4OeE/yHVMteCkw9k=
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw=
@@ -619,8 +625,6 @@ github.com/aws/aws-msk-iam-sasl-signer-go v1.0.1 h1:nMp7diZObd4XEVUR0pEvn7/E13JI
github.com/aws/aws-msk-iam-sasl-signer-go v1.0.1/go.mod h1:MVYeeOhILFFemC/XlYTClvBjYZrg/EPd3ts885KrNTI=
github.com/aws/aws-sdk-go-v2/service/kms v1.35.3 h1:UPTdlTOwWUX49fVi7cymEN6hDqCwe3LNv1vi7TXUutk=
github.com/aws/aws-sdk-go-v2/service/kms v1.35.3/go.mod h1:gjDP16zn+WWalyaUqwCCioQ8gU8lzttCCc9jYsiQI/8=
-github.com/aws/aws-sdk-go-v2/service/kms v1.38.1 h1:tecq7+mAav5byF+Mr+iONJnCBf4B4gon8RSp4BrweSc=
-github.com/aws/aws-sdk-go-v2/service/kms v1.38.1/go.mod h1:cQn6tAF77Di6m4huxovNM7NVAozWTZLsDRp9t8Z/WYk=
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.32.4 h1:NgRFYyFpiMD62y4VPXh4DosPFbZd4vdMVBWKk0VmWXc=
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.32.4/go.mod h1:TKKN7IQoM7uTnyuFm9bm9cw5P//ZYTl4m3htBWQ1G/c=
github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.35.2 h1:vlYXbindmagyVA3RS2SPd47eKZ00GZZQcr+etTviHtc=
@@ -674,10 +678,12 @@ github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo
github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=
github.com/chromedp/sysutil v1.1.0 h1:PUFNv5EcprjqXZD9nJb9b/c9ibAbxiYo4exNWZyipwM=
github.com/chromedp/sysutil v1.1.0/go.mod h1:WiThHUdltqCNKGc4gaU50XgYjwjYIhKWoHGPTUfWTJ8=
+github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE=
github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM=
github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ=
github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI=
github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk=
+github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8=
github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04=
github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8=
github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY=
@@ -687,7 +693,6 @@ github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nC
github.com/cncf/xds/go v0.0.0-20240723142845-024c85f92f20/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8=
-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 v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA=
github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU=
@@ -751,9 +756,11 @@ github.com/d4l3k/messagediff v1.2.1 h1:ZcAIMYsUg0EAp9X+tt8/enBE/Q8Yd5kzPynLyKptt
github.com/d4l3k/messagediff v1.2.1/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo=
github.com/davecgh/go-xdr v0.0.0-20161123171359-e6a2ba005892 h1:qg9VbHo1TlL0KDM0vYvBG9EY0X0Yku5WYIPoFWt8f6o=
github.com/davecgh/go-xdr v0.0.0-20161123171359-e6a2ba005892/go.mod h1:CTDl0pzVzE5DEzZhPfvhY/9sPFMQIxaJ9VAMs9AagrE=
+github.com/dchest/siphash v1.2.3/go.mod h1:0NvQU092bT0ipiFN++/rXm69QG9tVxLAlQHIXMPAkHc=
github.com/dchest/uniuri v1.2.0 h1:koIcOUdrTIivZgSLhHQvKgqdWZq5d7KdMEWF1Ud6+5g=
github.com/dchest/uniuri v1.2.0/go.mod h1:fSzm4SLHzNZvWLvWJew423PhAzkpNQYq+uNLq4kxhkY=
github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3 h1:tkum0XDgfR0jcVVXuTsYv/erY2NnEDqwRojbxR1rBYA=
+github.com/dgryski/go-ddmin v0.0.0-20210904190556-96a6d69f1034/go.mod h1:zz4KxBkcXUWKjIcrc+uphJ1gPh/t18ymGm3PmQ+VGTk=
github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b h1:Yqiad0+sloMPdd/0Fg22actpFx0dekpzt1xJmVNVkU0=
github.com/dhui/dktest v0.3.0 h1:kwX5a7EkLcjo7VpsPQSYJcKGbXBXdjI9FGjuUj1jn6I=
github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U=
@@ -802,8 +809,11 @@ github.com/envoyproxy/go-control-plane v0.13.1/go.mod h1:X45hY0mufo6Fd0KW3rqsGvQ
github.com/envoyproxy/go-control-plane/envoy v1.32.3/go.mod h1:F6hWupPfh75TBXGKA++MCT/CZHFq5r9/uwt/kQYkZfE=
github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew=
github.com/envoyproxy/protoc-gen-validate v1.1.0/go.mod h1:sXRDRVmzEbkM7CVcM06s9shE/m23dg3wzjl0UWqJ2q4=
+github.com/evanphx/json-patch/v5 v5.9.11 h1:/8HVnzMq13/3x9TPvjG08wUGqBTmZBsCWzjTM0wiaDU=
+github.com/evanphx/json-patch/v5 v5.9.11/go.mod h1:3j+LviiESTElxA4p3EMKAB9HXj3/XEtnUf6OZxqIQTM=
github.com/expr-lang/expr v1.16.9/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4=
github.com/expr-lang/expr v1.17.0/go.mod h1:8/vRC7+7HBzESEqt5kKpYXxrxkr31SaO8r40VO/1IT4=
+github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo=
github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M=
github.com/felixge/fgprof v0.9.4 h1:ocDNwMFlnA0NU0zSB3I52xkO4sFXk80VK9lXjLClu88=
@@ -858,6 +868,8 @@ github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91
github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn0+wvQ3bZ8b/AU4=
github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
+github.com/gobuffalo/flect v1.0.3 h1:xeWBM2nui+qnVvNM4S3foBhCAL2XgPU+a7FdpelbTq4=
+github.com/gobuffalo/flect v1.0.3/go.mod h1:A5msMlrHtLqh9umBSnvabjsMrCcCpAyzglnDvkbYKHs=
github.com/goccmack/gocc v0.0.0-20230228185258-2292f9e40198 h1:FSii2UQeSLngl3jFoR4tUKZLprO7qUlh/TKKticc0BM=
github.com/goccmack/gocc v0.0.0-20230228185258-2292f9e40198/go.mod h1:DTh/Y2+NbnOVVoypCCQrovMPDKUGp4yZpSbWg5D0XIM=
github.com/goccy/go-yaml v1.11.0 h1:n7Z+zx8S9f9KgzG6KtQKf+kwqXZlLNR2F6018Dgau54=
@@ -874,12 +886,15 @@ github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzq
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12 h1:uK3X/2mt4tbSGoHvbLBHUny7CKiuwUip3MArtukol4E=
github.com/gomarkdown/markdown v0.0.0-20230716120725-531d2d74bc12/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA=
+github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4=
github.com/google/cel-go v0.23.2/go.mod h1:52Pb6QsDbC5kvgxvZhiL9QX1oZEkcUF/ZqaPx1J5Wwo=
github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY=
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.3.0 h1:PVRnTgtArZ3QQqTGtbtjtnIkzl2iY2kt24yqbrf7td8=
github.com/google/go-pkcs11 v0.3.0/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY=
+github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
+github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db/go.mod h1:vavhavw2zAxS5dIdcRluK6cSGGPlZynqzFM8NdvU144=
github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA=
@@ -895,6 +910,7 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKG
github.com/googleapis/enterprise-certificate-proxy v0.3.5/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA=
github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4=
github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk=
+github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA=
github.com/googleapis/gnostic v0.3.0 h1:CcQijm0XKekKjP/YCz28LXVSpgguuB+nCxaSjCe09y0=
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=
@@ -919,6 +935,7 @@ github.com/grafana/alerting v0.0.0-20250429131604-de176b4a0309 h1:H2p3XKDHnTBGkM
github.com/grafana/alerting v0.0.0-20250429131604-de176b4a0309/go.mod h1:pMfhRxL2LZ3Pm8iy7VcVsb9CLYuBtjFYbf1oxgx7yFA=
github.com/grafana/alerting v0.0.0-20250701210250-cea2d1683945 h1:3imTbxFpZSVI6IBIB9mn+Xc40lUweWjfMaBSgXR7rLs=
github.com/grafana/alerting v0.0.0-20250701210250-cea2d1683945/go.mod h1:gtR7agmxVfJOmNKV/n2ZULgOYTYNL+PDKYB5N48tQ7Q=
+github.com/grafana/alerting v0.0.0-20250709204613-c5c6f9c1653d/go.mod h1:gtR7agmxVfJOmNKV/n2ZULgOYTYNL+PDKYB5N48tQ7Q=
github.com/grafana/authlib v0.0.0-20250123104008-e99947858901/go.mod h1:/gYfphsNu9v1qYWXxpv1NSvMEMSwvdf8qb8YlgwIRl8=
github.com/grafana/authlib/types v0.0.0-20250120144156-d6737a7dc8f5/go.mod h1:qYjSd1tmJiuVoSICp7Py9/zD54O9uQQA3wuM6Gg4DFM=
github.com/grafana/authlib/types v0.0.0-20250120145936-5f0e28e7a87c/go.mod h1:qYjSd1tmJiuVoSICp7Py9/zD54O9uQQA3wuM6Gg4DFM=
@@ -931,6 +948,7 @@ github.com/grafana/gomemcache v0.0.0-20250228145437-da7b95fd2ac1/go.mod h1:j/s0j
github.com/grafana/grafana-app-sdk/logging v0.38.0/go.mod h1:Y/bvbDhBiV/tkIle9RW49pgfSPIPSON8Q4qjx3pyqDk=
github.com/grafana/grafana-app-sdk/logging v0.39.0 h1:3GgN5+dUZYqq74Q+GT9/ET+yo+V54zWQk/Q2/JsJQB4=
github.com/grafana/grafana-app-sdk/logging v0.39.0/go.mod h1:WhDENSnaGHtyVVwZGVnAR7YLvh2xlLDYR3D7E6h7XVk=
+github.com/grafana/grafana-app-sdk/logging v0.39.1/go.mod h1:WhDENSnaGHtyVVwZGVnAR7YLvh2xlLDYR3D7E6h7XVk=
github.com/grafana/grafana-aws-sdk v0.38.2 h1:TzQD0OpWsNjtldi5G5TLDlBRk8OyDf+B5ujcoAu4Dp0=
github.com/grafana/grafana-aws-sdk v0.38.2/go.mod h1:j3vi+cXYHEFqjhBGrI6/lw1TNM+dl0Y3f0cSnDOPy+s=
github.com/grafana/grafana-aws-sdk v1.0.2 h1:98eBuHYFmgvH0xO9kKf4RBsEsgQRp8EOA/9yhDIpkss=
@@ -947,6 +965,7 @@ github.com/grafana/grafana/apps/alerting/notifications v0.0.0-20250416173722-ec1
github.com/grafana/grafana/apps/alerting/notifications v0.0.0-20250506052906-7a2fc797fb4a/go.mod h1:VkX53kBiqIMHBoGgeEDJnzm5Nwcmv/726tuZuT5SvJY=
github.com/grafana/grafana/apps/dashboard v0.0.0-20250616135341-59c2f154336b/go.mod h1:OIlvNnUufYDhBXa4xK4CyzPI2C69ZJkHy5+aFDyPtXw=
github.com/grafana/grafana/apps/dashboard v0.0.0-20250616145019-8d27f12428cb/go.mod h1:OIlvNnUufYDhBXa4xK4CyzPI2C69ZJkHy5+aFDyPtXw=
+github.com/grafana/grafana/apps/dashboard v0.0.0-20250627191313-2f1a6ae1712b/go.mod h1:eR8wca74ADgxBrvX0uNpdB1qnPaGx/KhCm4Xj8oqHfQ=
github.com/grafana/grafana/apps/investigation v0.0.0-20250121113133-e747350fee2d/go.mod h1:HQprw3MmiYj5OUV9CZnkwA1FKDZBmYACuAB3oDvUOmI=
github.com/grafana/grafana/apps/playlist v0.0.0-20250121113133-e747350fee2d/go.mod h1:DjJe5osrW/BKrzN9hAAOSElNWutj1bcriExa7iDP7kA=
github.com/grafana/grafana/pkg/aggregator v0.0.0-20250121113133-e747350fee2d/go.mod h1:1sq0guad+G4SUTlBgx7SXfhnzy7D86K/LcVOtiQCiMA=
@@ -969,8 +988,6 @@ github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJr
github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA=
github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90=
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=
@@ -980,6 +997,7 @@ github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8Io
github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg=
github.com/hashicorp/go-msgpack v1.1.5 h1:9byZdVjKTe5mce63pRVNP1L7UAmdHOTEMGehn6KvJWs=
github.com/hashicorp/go-msgpack v1.1.5/go.mod h1:gWVc3sv/wbDmR3rQsj1CAktEZzoz1YNK9NfGLXJ69/4=
+github.com/hashicorp/go-msgpack/v2 v2.1.1/go.mod h1:upybraOAblm4S7rx0+jeNy+CWWhzywQsSRV5033mMu4=
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/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y=
@@ -1003,6 +1021,8 @@ github.com/influxdata/tdigest v0.0.2-0.20210216194612-fc98d27c9e8b h1:i44CesU68Z
github.com/influxdata/tdigest v0.0.2-0.20210216194612-fc98d27c9e8b/go.mod h1:Z0kXnxzbTC2qrx4NaIzYkE1k66+6oEDQTvL95hQFh5Y=
github.com/influxdata/telegraf v1.16.3 h1:x0qeuSGGMg5y+YqP/5ZHwXZu3bcBrO8AAQOTNlYEb1c=
github.com/influxdata/telegraf v1.16.3/go.mod h1:fX/6k7qpIqzVPWyeIamb0wN5hbwc0ANUaTS80lPYFB8=
+github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso=
+github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA=
github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw=
github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA=
github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc=
@@ -1090,6 +1110,7 @@ github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqA
github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18=
github.com/matryer/moq v0.5.2 h1:b2bsanSaO6IdraaIvPBzHnqcrkkQmk1/310HdT2nNQs=
github.com/matryer/moq v0.5.2/go.mod h1:W/k5PLfou4f+bzke9VPXTbfJljxoeR1tLHigsmbshmU=
+github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg=
github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2 h1:yVCLo4+ACVroOEr4iFU1iH46Ldlzz2rTuu18Ra7M8sU=
github.com/maxbrunsfeld/counterfeiter/v6 v6.11.2/go.mod h1:VzB2VoMh1Y32/QqDfg9ZJYHj99oM4LiGtqPZydTiQSQ=
@@ -1097,6 +1118,7 @@ github.com/mfridman/xflag v0.1.0 h1:TWZrZwG1QklFX5S4j1vxfF1sZbZeZSGofMwPMLAF29M=
github.com/mfridman/xflag v0.1.0/go.mod h1:/483ywM5ZO5SuMVjrIGquYNE5CzLrj5Ux/LxWWnjRaE=
github.com/microcosm-cc/bluemonday v1.0.25 h1:4NEwSfiJ+Wva0VxN5B8OwMicaJvD8r9tlJWm9rtloEg=
github.com/microcosm-cc/bluemonday v1.0.25/go.mod h1:ZIOjCQp1OrzBBPIJmfX4qDYFuhU02nx4bn030ixfHLE=
+github.com/miekg/dns v1.1.50/go.mod h1:e3IlAVfNqAllflbibAZEWOXOQ+Ynzk/dDozDxY7XnME=
github.com/minio/sha256-simd v0.1.1 h1:5QHSlgo3nt5yKOJrC7W8w7X+NFl8cMPZm96iu8kKUJU=
github.com/minio/sha256-simd v0.1.1/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM=
github.com/mitchellh/cli v1.1.5 h1:OxRIeJXpAMztws/XHlN2vu6imG5Dpq+j61AzAX5fLng=
@@ -1133,8 +1155,10 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWb
github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1 h1:dOYG7LS/WK00RWZc8XGgcUTlTxpp3mKhdR2Q9z9HbXM=
github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1/go.mod h1:mpRZBD8SJ55OIICQ3iWH0Yz3cjzA61JdqMLoWXeB2+8=
github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To=
+github.com/onsi/ginkgo/v2 v2.21.0/go.mod h1:7Du3c42kxCUegi0IImZ1wUQzMBVecgIHjR1C+NkhLQo=
github.com/onsi/ginkgo/v2 v2.22.1/go.mod h1:S6aTpoRsSq2cZOd+pssHAlKW/Q/jZt6cPrPlnj4a1xM=
github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0=
+github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog=
github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.124.1 h1:+aiMrDR6xiaDM7xN4ByrBYI0Craqt68nZicmpYpt0co=
github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.124.1/go.mod h1:H/TEWN4jgExt0McrtrBK2VFK6r9LRsWtqhEZrH690rs=
github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.124.1 h1:NrjsoVPxI6lmV8jPImDcMeqYh+97Y71f/HB5Sfpfe3I=
@@ -1185,7 +1209,6 @@ github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2D
github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y=
github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30 h1:BHT1/DKsYDGkUgQ2jmMaozVcdk+sVfz0+1ZJq4zkWgw=
github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g=
-github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8=
github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI=
github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU=
github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw=
@@ -1202,6 +1225,7 @@ github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8
github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI=
github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20=
github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M=
+github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I=
github.com/prometheus/common/assets v0.2.0 h1:0P5OrzoHrYBOSM1OigWL3mY8ZvV2N4zIE/5AahrSrfM=
github.com/prometheus/statsd_exporter v0.26.1 h1:ucbIAdPmwAUcA+dU+Opok8Qt81Aw8HanlO+2N/Wjv7w=
github.com/prometheus/statsd_exporter v0.26.1/go.mod h1:XlDdjAmRmx3JVvPPYuFNUg+Ynyb5kR69iPPkQjxXFMk=
@@ -1217,6 +1241,9 @@ github.com/richardartoul/molecule v1.0.0 h1:+LFA9cT7fn8KF39zy4dhOnwcOwRoqKiBkPqK
github.com/richardartoul/molecule v1.0.0/go.mod h1:uvX/8buq8uVeiZiFht+0lqSLBHF+uGV8BrTv8W/SIwk=
github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s=
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
+github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
+github.com/rs/dnscache v0.0.0-20230804202142-fc85eb664529 h1:18kd+8ZUlt/ARXhljq+14TwAoKa61q6dX8jtwOf6DH8=
+github.com/rs/dnscache v0.0.0-20230804202142-fc85eb664529/go.mod h1:qe5TWALJ8/a1Lqznoc5BDHpYX/8HU60Hm2AwRmqzxqA=
github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww=
github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY=
github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245 h1:K1Xf3bKttbF+koVGaX5xngRIZ5bVjbmPnaxE/dR08uY=
@@ -1241,6 +1268,7 @@ github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg
github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ=
+github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g=
github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y=
github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk=
@@ -1271,6 +1299,8 @@ github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYN
github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY=
github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE=
github.com/trivago/tgo v1.0.7 h1:uaWH/XIy9aWYWpjm2CU3RpcqZXmX2ysQ9/Go+d9gyrM=
+github.com/tsenart/vegeta/v12 v12.12.0 h1:FKMMNomd3auAElO/TtbXzRFXAKGee6N/GKCGweFVm2U=
+github.com/tsenart/vegeta/v12 v12.12.0/go.mod h1:gpdfR++WHV9/RZh4oux0f6lNPhsOH8pCjIGUlcPQe1M=
github.com/tursodatabase/libsql-client-go v0.0.0-20240902231107-85af5b9d094d h1:dOMI4+zEbDI37KGb0TI44GUAwxHF9cMsIoDTJ7UmgfU=
github.com/tursodatabase/libsql-client-go v0.0.0-20240902231107-85af5b9d094d/go.mod h1:l8xTsYB90uaVdMHXMCxKKLSgw5wLYBwBKKefNIUnm9s=
github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8=
@@ -1342,6 +1372,7 @@ go.einride.tech/aip v0.68.1/go.mod h1:XaFtaj4HuA3Zwk9xoBtTWgNubZ0ZZXv9BZJCkuKuWb
go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I=
go.etcd.io/gofail v0.2.0 h1:p19drv16FKK345a09a1iubchlw/vmRuksmRzgBIGjcA=
go.etcd.io/gofail v0.2.0/go.mod h1:nL3ILMGfkXTekKI3clMBNazKnjUZjYLKmBHzsVAnC1o=
+go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
go.opentelemetry.io/collector v0.124.0 h1:g/dfdGFhBcQI0ggGxTmGlJnJ6Yl6T2gVxQoIj4UfXCc=
go.opentelemetry.io/collector v0.124.0/go.mod h1:QzERYfmHUedawjr8Ph/CBEEkVqWS8IlxRLAZt+KHlCg=
go.opentelemetry.io/collector/client v1.30.0 h1:QbvOrvwUGcnVjnIBn2zyLLubisOjgh7kMgkzDAiYpHg=
@@ -1468,6 +1499,9 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I=
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ=
+go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q=
+go.opentelemetry.io/contrib/instrumentation/runtime v0.62.0 h1:ZIt0ya9/y4WyRIzfLC8hQRRsWg0J9M9GyaGtIMiElZI=
+go.opentelemetry.io/contrib/instrumentation/runtime v0.62.0/go.mod h1:F1aJ9VuiKWOlWwKdTYDUp1aoS0HzQxg38/VLxKmhm5U=
go.opentelemetry.io/contrib/otelconf v0.15.0 h1:BLNiIUsrNcqhSKpsa6CnhE6LdrpY1A8X0szMVsu99eo=
go.opentelemetry.io/contrib/otelconf v0.15.0/go.mod h1:OPH1seO5z9dp1P26gnLtoM9ht7JDvh3Ws6XRHuXqImY=
go.opentelemetry.io/contrib/propagators/b3 v1.35.0 h1:DpwKW04LkdFRFCIgM3sqwTJA/QREHMeMHYPWP1WeaPQ=
@@ -1481,39 +1515,32 @@ go.opentelemetry.io/otel/bridge/opencensus v1.35.0 h1:4nJfffRbozhqnuukfRkiahA94m
go.opentelemetry.io/otel/bridge/opencensus v1.35.0/go.mod h1:359S30saRYNsB4A46EDx91SpXsQFNgkma7ftg2/L5/M=
go.opentelemetry.io/otel/bridge/opentracing v1.35.0 h1:qT4jl1fYl0hHuRopNcwS94QosLFhGYcS0HacPUeXmT4=
go.opentelemetry.io/otel/bridge/opentracing v1.35.0/go.mod h1:p5CbIL4v7uQz7mnQD6T/AZc1pPUzwz+2wZ1zrGY9Kgs=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0 h1:EtFWSnwW9hGObjkIdmlnWSydO+Qs8OwzfzXLUPg4xOc=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.37.0/go.mod h1:QjUEoiGCPkvFZ/MjK6ZZfNOS6mfVEVKYE99dFhuN2LI=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0 h1:bDMKF3RUSxshZ5OjOTi8rsHGaPKsAt76FaqgvIUySLc=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0/go.mod h1:dDT67G/IkA46Mr2l9Uj7HsQVwsjASyV9SjGofsiUZDA=
+go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.36.0/go.mod h1:rUKCPscaRWWcqGT6HnEmYrK+YNe5+Sw64xgQTOJ5b30=
+go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0/go.mod h1:RboSDkp7N292rgu+T0MgVt2qgFGu6qa1RpZDOtpL76w=
+go.opentelemetry.io/otel/exporters/prometheus v0.58.0/go.mod h1:7qo/4CLI+zYSNbv0GMNquzuss2FVZo3OYrGh96n4HNc=
go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0/go.mod h1:U2R3XyVPzn0WX7wOIypPuptulsMcPDPs/oiSVOMVnHY=
+go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.36.0/go.mod h1:PD57idA/AiFD5aqoxGxCvT/ILJPeHy3MjqU/NS7KogY=
go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco=
go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8=
go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY=
-go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
-go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
+go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg=
go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok=
go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0=
-go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
-go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
go.opentelemetry.io/otel/sdk/metric v1.29.0/go.mod h1:6zZLdCl2fkauYoZIOn/soQIDSWFmNSRcICarHfuhNJQ=
go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
+go.opentelemetry.io/otel/sdk/metric v1.36.0/go.mod h1:qTNOhFDfKRwX0yXOqJYegL5WRaW376QbB7P4Pb0qva4=
go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ=
go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A=
go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=
go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY=
-go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os=
-go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo=
-go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
-go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
-go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc=
golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
+golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
+golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54=
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc=
golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ=
@@ -1522,6 +1549,7 @@ golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbV
golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc=
golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY=
+golang.org/x/exp v0.0.0-20240909161429-701f63a606c0/go.mod h1:2TbTHSBQa924w8M6Xs1QcRcFwyucIwBGpK1p2f1YFFY=
golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e h1:qyrTQ++p1afMkO4DPEeLGq/3oTsdlvdH4vqZUBWzUKM=
golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk=
golang.org/x/image v0.25.0 h1:Y6uW6rH1y5y/LK1J8BPWZtr6yZ7hrsy6hFrXjgsc2fQ=
@@ -1529,13 +1557,19 @@ golang.org/x/image v0.25.0/go.mod h1:tCAmOEGthTtkalusGp1g3xa2gke8J6c2N565dTyl9Rs
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.6.0-dev.0.20220818022119-ed83ed61efb9/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
+golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
golang.org/x/mod v0.24.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww=
golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
+golang.org/x/net v0.3.0/go.mod h1:MBQ8lrhLObU/6UmLb4fmbmk5OcyYmqtbGd/9yIeKjEE=
+golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
+golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
@@ -1543,22 +1577,33 @@ golang.org/x/net v0.38.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8=
golang.org/x/oauth2 v0.19.0/go.mod h1:vYi7skDa1x015PmRRYZ7+s1cWyPgrPiSYRe4rnsexc8=
golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8=
+golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457 h1:zf5N6UOrA487eEFacMePxjXAJctxKmyjKUsjA11Uzuk=
golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0=
golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g=
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4=
golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/time v0.9.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
+golang.org/x/tools v0.0.0-20190424220101-1e8e1cfdf96b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
+golang.org/x/tools v0.4.0/go.mod h1:UE5sM2OK9E/d67R0ANs2xJizIymRP5gJU295PvKXxjQ=
+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=
+golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c=
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
golang.org/x/tools v0.28.0/go.mod h1:dcIOrVd3mfQKTgrDVQHqCPMWy6lnhfhtX3hLXYVLfRw=
@@ -1582,6 +1627,7 @@ google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqt
google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc=
google.golang.org/genproto v0.0.0-20250106144421-5f5ef82da422/go.mod h1:1NPAxoesyw/SgLPqaUp9u1f9PWCLAk/jVmhx7gJZStg=
google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4/go.mod h1:qbZzneIOXSq+KFAFut9krLfRLZiFLzZL5u2t8SV83EE=
+google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:sAo5UzpjUwgFBCzupwhcLcxHVDK7vG5IqI30YnwX2eE=
google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:49MsLSx0oWMOZqcpB3uL8ZOkAh1+TndpJ8ONoCBWiZk=
google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk=
google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6/go.mod h1:10yRODfgim2/T8csjQsMPgZOMvtytXKTDRzH6HRGzRw=
@@ -1626,14 +1672,17 @@ google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFN
google.golang.org/grpc v1.67.3/go.mod h1:YGaHCc6Oap+FzBJTZLBzkGSYt/cvGPFTPxkn7QfSU8s=
google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw=
google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw=
+google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec=
google.golang.org/grpc v1.72.2/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM=
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE=
google.golang.org/grpc/examples v0.0.0-20230224211313-3775f633ce20 h1:MLBCGN1O7GzIx+cBiwfYPwtmZ41U3Mn/cotLJciaArI=
google.golang.org/grpc/examples v0.0.0-20230224211313-3775f633ce20/go.mod h1:Nr5H8+MlGWr5+xX/STzdoEqJrO+YteqFbMyCsrb6mH0=
google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
google.golang.org/protobuf v1.36.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc=
gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8=
gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
@@ -1654,12 +1703,19 @@ k8s.io/code-generator v0.33.1 h1:ZLzIRdMsh3Myfnx9BaooX6iQry29UJjVfVG+BuS+UMw=
k8s.io/code-generator v0.33.1/go.mod h1:HUKT7Ubp6bOgIbbaPIs9lpd2Q02uqkMCMx9/GjDrWpY=
k8s.io/code-generator v0.33.2 h1:PCJ0Y6viTCxxJHMOyGqYwWEteM4q6y1Hqo2rNpl6jF4=
k8s.io/code-generator v0.33.2/go.mod h1:hBjCA9kPMpjLWwxcr75ReaQfFXY8u+9bEJJ7kRw3J8c=
+k8s.io/code-generator v0.33.3 h1:6+34LhYkIuQ/yn/E3qlpVqjQaP8smzCu4NE1A8b0LWs=
+k8s.io/code-generator v0.33.3/go.mod h1:6Y02+HQJYgNphv9z3wJB5w+sjYDIEBQW7sh62PkufvA=
k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6 h1:4s3/R4+OYYYUKptXPhZKjQ04WJ6EhQQVFdjOFvCazDk=
k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7 h1:2OX19X59HxDprNCVrWi6jb7LW1PoqTlYqEq5H2oetog=
k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU=
k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8=
k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I=
+k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0=
+k8s.io/kube-aggregator v0.33.1/go.mod h1:16/wlU5Lj7hNJSv7JSu5FLvxyrgiJVLCHzfVoECAsuI=
+k8s.io/kube-aggregator v0.33.2/go.mod h1:qQbliLwcdmx7/8mtvkc/9QV/ON2M6ZBMcffEUmrqKFw=
+knative.dev/hack v0.0.0-20250514121446-f525e187efdc h1:8HmclJlA0zNE/G1SkgdC3/IFSSyhaSz2iIhihU6YbEo=
+knative.dev/hack v0.0.0-20250514121446-f525e187efdc/go.mod h1:R0ritgYtjLDO9527h5vb5X6gfvt5LCrJ55BNbVDsWiY=
lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI=
modernc.org/cc/v3 v3.36.3 h1:uISP3F66UlixxWEcKuIWERa4TwrZENHSL8tWxZz8bHg=
modernc.org/ccgo/v3 v3.16.9 h1:AXquSwg7GuMk11pIdw7fmO1Y/ybgazVkMhsZWCV0mHM=
diff --git a/hack/go.mod b/hack/go.mod
index eb429b002ec..b1685be7028 100644
--- a/hack/go.mod
+++ b/hack/go.mod
@@ -1,6 +1,6 @@
module github.com/grafana/grafana/hack
-go 1.24.4
+go 1.24.5
require k8s.io/code-generator v0.33.1
diff --git a/lerna.json b/lerna.json
index 71b3ceeef8f..fe2cdbf0402 100644
--- a/lerna.json
+++ b/lerna.json
@@ -1,5 +1,5 @@
{
"$schema": "node_modules/lerna/schemas/lerna-schema.json",
"npmClient": "yarn",
- "version": "12.1.0-pre"
+ "version": "12.2.0-pre"
}
diff --git a/package.json b/package.json
index 202f700962a..4b25b18298f 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
"license": "AGPL-3.0-only",
"private": true,
"name": "grafana",
- "version": "12.1.0-pre",
+ "version": "12.2.0-pre",
"repository": "github:grafana/grafana",
"scripts": {
"predev": "./scripts/check-frontend-dev.sh",
@@ -24,13 +24,13 @@
"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:server": "yarn e2e:plugin:build && ./e2e-playwright/start-and-run-suite",
"e2e:playwright:storybook": "yarn playwright test -c playwright.storybook.config.ts",
"e2e:storybook": "PORT=9001 ./e2e/run-suite storybook true",
"e2e:plugin:build": "nx run-many -t build --projects='@test-plugins/*'",
"e2e:plugin:build:dev": "nx run-many -t dev --projects='@test-plugins/*' --maxParallel=100",
"test": "jest --notify --watch",
"test:coverage": "jest --coverage",
+ "test:storybook": "yarn workspace @grafana/ui storybook:test",
"test:coverage:changes": "jest --coverage --changedSince=origin/main",
"test:accessibility-report": "./scripts/generate-a11y-report.sh",
"test:ci": "mkdir -p reports/junit && JEST_JUNIT_OUTPUT_DIR=reports/junit jest --ci --reporters=default --reporters=jest-junit -w ${TEST_MAX_WORKERS:-100%} --shard=${TEST_SHARD:-1}/${TEST_SHARD_TOTAL:-1}",
@@ -47,7 +47,7 @@
"prettier:check": "prettier --check --ignore-path .prettierignore --list-different=false --log-level=warn \"**/*.{ts,tsx,scss,md,mdx,json,js,cjs}\"",
"prettier:checkDocs": "prettier --check --list-different=false --log-level=warn \"docs/**/*.md\" \"*.md\" \"packages/**/*.{ts,tsx,scss,md,mdx,json,js,cjs}\"",
"prettier:write": "prettier --ignore-path .prettierignore --list-different \"**/*.{js,ts,tsx,scss,md,mdx,json,cjs}\" --write",
- "start": "yarn predev && NODE_ENV=dev nx exec -- webpack --config scripts/webpack/webpack.dev.js --watch",
+ "start": "yarn predev && NODE_ENV=dev nx exec -- webpack --config scripts/webpack/webpack.dev.js --watch $@",
"start:liveReload": "yarn start -- --env liveReload=1",
"start:noTsCheck": "yarn start -- --env noTsCheck=1",
"start:noLint": "yarn start -- --env noTsCheck=1 --env noLint=1",
@@ -80,9 +80,9 @@
},
"devDependencies": {
"@arethetypeswrong/cli": "^0.18.2",
- "@babel/core": "7.26.10",
- "@babel/preset-env": "7.26.9",
- "@babel/runtime": "7.27.0",
+ "@babel/core": "7.28.0",
+ "@babel/preset-env": "7.28.0",
+ "@babel/runtime": "7.28.2",
"@betterer/betterer": "5.4.0",
"@betterer/cli": "5.4.0",
"@crowdin/crowdin-api-client": "^1.42.0",
@@ -90,13 +90,13 @@
"@emotion/eslint-plugin": "11.12.0",
"@grafana/eslint-config": "8.0.0",
"@grafana/eslint-plugin": "link:./packages/grafana-eslint-rules",
- "@grafana/plugin-e2e": "2.0.0",
+ "@grafana/plugin-e2e": "2.1.7",
"@grafana/test-utils": "workspace:*",
"@grafana/tsconfig": "^2.0.0",
"@manypkg/get-packages": "^2.2.0",
"@npmcli/package-json": "^5.2.0",
- "@playwright/test": "1.52.0",
- "@pmmmwh/react-refresh-webpack-plugin": "0.5.15",
+ "@playwright/test": "1.54.1",
+ "@pmmmwh/react-refresh-webpack-plugin": "0.6.1",
"@react-types/button": "3.10.2",
"@react-types/menu": "3.9.14",
"@react-types/overlays": "3.8.12",
@@ -109,7 +109,7 @@
"@swc/helpers": "0.5.15",
"@testing-library/dom": "10.4.0",
"@testing-library/jest-dom": "6.6.3",
- "@testing-library/react": "16.2.0",
+ "@testing-library/react": "16.3.0",
"@testing-library/user-event": "14.6.1",
"@types/babel__core": "^7",
"@types/babel__preset-env": "^7",
@@ -135,7 +135,7 @@
"@types/lodash": "4.17.20",
"@types/logfmt": "^1.2.3",
"@types/lucene": "^2",
- "@types/node": "22.15.0",
+ "@types/node": "22.16.5",
"@types/node-forge": "^1",
"@types/ol-ext": "npm:@siedlerchr/types-ol-ext@3.3.0",
"@types/pluralize": "^0.0.33",
@@ -175,17 +175,17 @@
"codeowners": "^5.1.1",
"confusing-browser-globals": "^1.0.11",
"copy-webpack-plugin": "12.0.2",
- "core-js": "3.40.0",
+ "core-js": "3.44.0",
"crashme": "0.0.15",
"css-loader": "7.1.2",
"css-minimizer-webpack-plugin": "7.0.2",
"cypress": "14.3.2",
"cypress-file-upload": "5.0.8",
"cypress-recurse": "^1.35.3",
- "esbuild": "0.25.6",
+ "esbuild": "0.25.8",
"esbuild-loader": "4.3.0",
"esbuild-plugin-browserslist": "^1.0.0",
- "eslint": "9.19.0",
+ "eslint": "9.32.0",
"eslint-config-prettier": "9.1.0",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jest": "28.11.0",
@@ -202,7 +202,7 @@
"eslint-webpack-plugin": "4.2.0",
"expose-loader": "5.0.1",
"fishery": "^2.2.2",
- "fork-ts-checker-webpack-plugin": "9.0.2",
+ "fork-ts-checker-webpack-plugin": "9.1.0",
"glob": "11.0.3",
"html-loader": "5.1.0",
"html-webpack-plugin": "5.6.3",
@@ -233,19 +233,19 @@
"postcss-loader": "8.1.1",
"postcss-reporter": "7.1.0",
"postcss-scss": "4.0.9",
- "prettier": "3.4.2",
+ "prettier": "3.6.2",
"publint": "^0.3.12",
"react-refresh": "0.14.0",
"react-select-event": "5.5.1",
"redux-mock-store": "1.5.5",
"rimraf": "6.0.1",
"sass": "1.83.4",
- "sass-loader": "16.0.4",
+ "sass-loader": "16.0.5",
"smtp-tester": "^2.1.0",
"style-loader": "4.0.0",
"stylelint": "16.14.1",
"stylelint-config-sass-guidelines": "12.1.0",
- "terser-webpack-plugin": "5.3.11",
+ "terser-webpack-plugin": "5.3.14",
"testing-library-selector": "0.3.1",
"tracelib": "1.0.1",
"ts-jest": "29.2.5",
@@ -254,9 +254,8 @@
"webpack": "5.97.1",
"webpack-assets-manifest": "^5.1.0",
"webpack-cli": "6.0.1",
- "webpack-dev-server": "5.2.1",
"webpack-livereload-plugin": "3.0.2",
- "webpack-manifest-plugin": "5.0.0",
+ "webpack-manifest-plugin": "5.0.1",
"webpack-merge": "6.0.1",
"webpack-subresource-integrity": "^5.2.0-rc.1",
"webpackbar": "^7.0.0",
@@ -269,10 +268,11 @@
"@emotion/css": "11.13.5",
"@emotion/react": "11.14.0",
"@fingerprintjs/fingerprintjs": "^3.4.2",
- "@floating-ui/react": "0.27.13",
+ "@floating-ui/react": "0.27.14",
"@formatjs/intl-durationformat": "^0.7.0",
"@glideapps/glide-data-grid": "^6.0.0",
"@grafana/alerting": "workspace:*",
+ "@grafana/assistant": "0.0.10",
"@grafana/aws-sdk": "0.7.1",
"@grafana/azure-sdk": "0.0.7",
"@grafana/data": "workspace:*",
@@ -325,7 +325,7 @@
"ansicolor": "2.0.3",
"baron": "3.0.3",
"brace": "0.11.1",
- "centrifuge": "5.3.5",
+ "centrifuge": "5.4.0",
"classnames": "2.5.1",
"combokeys": "^3.0.0",
"comlink": "4.4.2",
@@ -361,7 +361,7 @@
"lru-cache": "11.1.0",
"lru-memoize": "^1.1.0",
"lucene": "^2.1.1",
- "marked": "16.0.0",
+ "marked": "16.1.1",
"memoize-one": "6.0.0",
"micro-memoize": "^4.1.2",
"ml-regression-polynomial": "^3.0.0",
@@ -372,7 +372,7 @@
"moveable": "0.53.0",
"nanoid": "^5.0.9",
"node-forge": "^1.3.1",
- "ol": "10.6.0",
+ "ol": "10.6.1",
"ol-ext": "4.0.33",
"pluralize": "^8.0.0",
"prismjs": "1.30.0",
@@ -427,15 +427,14 @@
"type-fest": "^4.18.2",
"uplot": "1.6.32",
"uuid": "11.1.0",
- "vis-data": "^7.1.10",
- "vis-network": "9.1.13",
+ "vis-data": "^8.0.0",
+ "vis-network": "10.0.1",
"whatwg-fetch": "3.6.20"
},
"resolutions": {
"underscore": "1.13.7",
"@types/slate": "0.47.11",
- "semver@~7.0.0": "7.5.4",
- "semver@7.3.4": "7.5.4",
+ "semver@npm:~7.3.5": "^7.3.5",
"debug@npm:^0.7.2": "2.6.9",
"debug@npm:^0.7.4": "2.6.9",
"slate-dev-environment@^0.2.2": "patch:slate-dev-environment@npm:0.2.5#.yarn/patches/slate-dev-environment-npm-0.2.5-9aeb7da7b5.patch",
@@ -464,7 +463,7 @@
},
"packageManager": "yarn@4.9.2",
"dependenciesMeta": {
- "prettier@3.4.2": {
+ "prettier@3.6.2": {
"unplugged": true
}
},
diff --git a/packages/README.md b/packages/README.md
index b3797e69514..525d77097fb 100644
--- a/packages/README.md
+++ b/packages/README.md
@@ -53,7 +53,6 @@ Every commit to main that has changes within the `packages` directory is a subje
3. Run `yarn packages:build` script that compiles distribution code in `packages/grafana-*/dist`.
4. Run `yarn packages:pack` script to compress each package into `npm-artifacts/*.tgz` files. This is required for yarn to replace properties in the package.json files declared in the `publishConfig` property.
5. Depending on whether or not it's a prerelease:
-
- When releasing a prerelease run `./scripts/publish-npm-packages.sh --dist-tag 'next' --registry 'https://registry.npmjs.org/'` to publish new versions.
- When releasing a stable version run `./scripts/publish-npm-packages.sh --dist-tag 'latest' --registry 'https://registry.npmjs.org/'` to publish new versions.
- When releasing a test version run `./scripts/publish-npm-packages.sh --dist-tag 'test' --registry 'https://registry.npmjs.org/'` to publish test versions.
diff --git a/packages/grafana-alerting/package.json b/packages/grafana-alerting/package.json
index 32ab506a757..0d4dfa1c746 100644
--- a/packages/grafana-alerting/package.json
+++ b/packages/grafana-alerting/package.json
@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/alerting",
- "version": "12.1.0-pre",
+ "version": "12.2.0-pre",
"description": "Grafana Alerting Library – Build vertical integrations on top of the industry-leading alerting solution",
"keywords": [
"typescript",
@@ -75,7 +75,7 @@
"react-redux": "^9.2.0",
"rimraf": "^6.0.1",
"rollup": "^4.22.4",
- "rollup-plugin-esbuild": "6.2.0",
+ "rollup-plugin-esbuild": "6.2.1",
"rollup-plugin-node-externals": "^8.0.0",
"type-fest": "^4.40.0",
"typescript": "5.8.3"
diff --git a/packages/grafana-alerting/rollup.config.ts b/packages/grafana-alerting/rollup.config.ts
index bd1384bbe21..1d9b0e1ae40 100644
--- a/packages/grafana-alerting/rollup.config.ts
+++ b/packages/grafana-alerting/rollup.config.ts
@@ -10,10 +10,12 @@ export default [
input: entryPoint,
plugins,
output: [cjsOutput(pkg), esmOutput(pkg, 'grafana-alerting')],
+ treeshake: false,
},
{
input: 'src/unstable.ts',
plugins,
output: [cjsOutput(pkg), esmOutput(pkg, 'grafana-alerting')],
+ treeshake: false,
},
];
diff --git a/packages/grafana-alerting/src/grafana/contactPoints/components/ContactPointSelector/ContactPointSelector.story.tsx b/packages/grafana-alerting/src/grafana/contactPoints/components/ContactPointSelector/ContactPointSelector.story.tsx
index 11033d82739..46f3f72ed6f 100644
--- a/packages/grafana-alerting/src/grafana/contactPoints/components/ContactPointSelector/ContactPointSelector.story.tsx
+++ b/packages/grafana-alerting/src/grafana/contactPoints/components/ContactPointSelector/ContactPointSelector.story.tsx
@@ -14,6 +14,8 @@ const meta: Meta = {
docs: {
page: mdx,
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
};
diff --git a/packages/grafana-data/package.json b/packages/grafana-data/package.json
index 64a027650c9..99cf6ee0f52 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": "12.1.0-pre",
+ "version": "12.2.0-pre",
"description": "Grafana Data Library",
"keywords": [
"typescript"
@@ -56,7 +56,8 @@
},
"dependencies": {
"@braintree/sanitize-url": "7.0.1",
- "@grafana/schema": "12.1.0-pre",
+ "@grafana/i18n": "12.2.0-pre",
+ "@grafana/schema": "12.2.0-pre",
"@leeoniya/ufuzzy": "1.0.18",
"@types/d3-interpolate": "^3.0.0",
"@types/string-hash": "1.1.3",
@@ -68,11 +69,11 @@
"fast_array_intersect": "1.1.0",
"history": "4.10.1",
"lodash": "4.17.21",
- "marked": "16.0.0",
+ "marked": "16.1.1",
"marked-mangle": "1.1.11",
"moment": "2.30.1",
"moment-timezone": "0.5.47",
- "ol": "10.6.0",
+ "ol": "10.6.1",
"papaparse": "5.5.3",
"react-use": "17.6.0",
"rxjs": "7.8.2",
@@ -87,17 +88,17 @@
"@rollup/plugin-node-resolve": "16.0.1",
"@types/history": "4.7.11",
"@types/lodash": "4.17.20",
- "@types/node": "22.15.0",
+ "@types/node": "22.16.5",
"@types/papaparse": "5.3.16",
"@types/react": "18.3.18",
"@types/react-dom": "18.3.5",
"@types/tinycolor2": "1.4.6",
- "esbuild": "0.25.6",
+ "esbuild": "0.25.8",
"react": "18.3.1",
"react-dom": "18.3.1",
"rimraf": "6.0.1",
"rollup": "^4.22.4",
- "rollup-plugin-esbuild": "6.2.0",
+ "rollup-plugin-esbuild": "6.2.1",
"rollup-plugin-node-externals": "^8.0.0",
"typescript": "5.8.3"
},
diff --git a/packages/grafana-data/rollup.config.ts b/packages/grafana-data/rollup.config.ts
index 98f8341f6de..378ab225769 100644
--- a/packages/grafana-data/rollup.config.ts
+++ b/packages/grafana-data/rollup.config.ts
@@ -10,10 +10,12 @@ export default [
input: entryPoint,
plugins,
output: [cjsOutput(pkg), esmOutput(pkg, 'grafana-data')],
+ treeshake: false,
},
{
input: 'src/unstable.ts',
plugins,
output: [cjsOutput(pkg), esmOutput(pkg, 'grafana-data')],
+ treeshake: false,
},
];
diff --git a/packages/grafana-data/src/dataframe/processDataFrame.test.ts b/packages/grafana-data/src/dataframe/processDataFrame.test.ts
index 7fab4d0bfb2..72b3041d87c 100644
--- a/packages/grafana-data/src/dataframe/processDataFrame.test.ts
+++ b/packages/grafana-data/src/dataframe/processDataFrame.test.ts
@@ -388,6 +388,59 @@ describe('sorted DataFrame', () => {
});
});
+describe('sorted DataFrame by nanos', () => {
+ it('Should sort nanos with numeric timestamp', () => {
+ const frame = toDataFrame({
+ fields: [
+ { name: 'first', type: FieldType.time, values: [1, 1, 2, 2, 3, 3], nanos: [100, 102, 1, 2, 1000, 999] },
+ { name: 'second', type: FieldType.string, values: ['a', 'b', 'c', 'd', 'e', 'f'] },
+ ],
+ });
+
+ const sorted = sortDataFrame(frame, 0, true);
+ expect(sorted.length).toEqual(6);
+ expect(sorted.fields[0].values).toEqual([3, 3, 2, 2, 1, 1]);
+ expect(sorted.fields[1].values).toEqual(['e', 'f', 'd', 'c', 'b', 'a']);
+ });
+
+ it('Should sort by nanos with dateTime timestamp', () => {
+ const frame = toDataFrame({
+ fields: [
+ {
+ name: 'first',
+ type: FieldType.time,
+ values: [dateTime(50), dateTime(50), dateTime(100)],
+ nanos: [1, 0, 100],
+ },
+ { name: 'second', type: FieldType.string, values: ['a', 'b', 'c'] },
+ ],
+ });
+
+ const sorted = sortDataFrame(frame, 0);
+ expect(sorted.length).toEqual(3);
+ expect(sorted.fields[0].values).toEqual([dateTime(50), dateTime(50), dateTime(100)]);
+ expect(sorted.fields[1].values).toEqual(['b', 'a', 'c']);
+ });
+
+ // Not sure if we expect nanos to exist on any field type besides time fields, but the schema allows it.
+ // Keep in mind if sorting by a non time field, the nanos is expected to present on the field that is being sorted
+ it('Should sort by nanos with string timestamp', () => {
+ const frame = toDataFrame({
+ fields: [
+ { name: 'fist', type: FieldType.time, values: [1, 2, 3, 3] },
+ { name: 'second', type: FieldType.string, values: ['a', 'b', 'b', 'c'], nanos: [100, 0, 1, 0] },
+ { name: 'third', type: FieldType.number, values: [2000, 3000, 1000] },
+ ],
+ });
+
+ const sorted = sortDataFrame(frame, 1, true);
+ expect(sorted.length).toEqual(4);
+ expect(sorted.fields[0].values).toEqual([3, 2, 3, 1]);
+ expect(sorted.fields[0].nanos).toBeUndefined();
+ expect(sorted.fields[1].values).toEqual(['c', 'b', 'b', 'a']);
+ });
+});
+
describe('reverse DataFrame', () => {
const frame = toDataFrame({
fields: [
diff --git a/packages/grafana-data/src/datetime/formatter.test.ts b/packages/grafana-data/src/datetime/formatter.test.ts
index 18bea1cde78..7ec7da8adc5 100644
--- a/packages/grafana-data/src/datetime/formatter.test.ts
+++ b/packages/grafana-data/src/datetime/formatter.test.ts
@@ -1,5 +1,90 @@
+import { initRegionalFormatForTests } from '@grafana/i18n';
+
+import * as featureToggles from '../utils/featureToggles';
+
import { dateTimeFormat, dateTimeFormatTimeAgo, dateTimeFormatWithAbbrevation, timeZoneAbbrevation } from './formatter';
+// Default time zone ("browser") is set to Pacific/Easter in jest.config.js
+const referenceDate = '2020-04-17T12:36:15.779Z';
+
+describe('dateTimeFormat (regionalFormatPreference)', () => {
+ let mockGetFeatureToggle: jest.SpyInstance;
+
+ beforeAll(() => {
+ initRegionalFormatForTests('en-AU');
+ mockGetFeatureToggle = jest.spyOn(featureToggles, 'getFeatureToggle').mockImplementation((featureName) => {
+ return featureName === 'localeFormatPreference';
+ });
+ });
+
+ afterAll(() => {
+ mockGetFeatureToggle.mockRestore();
+ });
+
+ it('formats dates in the browsers timezone by default', () => {
+ expect(dateTimeFormat(referenceDate)).toBe('17/04/2020, 6:36:15 am');
+ });
+
+ it('formats dates in the browsers timezone by default when invalid time zone is set', () => {
+ const options = { timeZone: 'asdf123' };
+ expect(dateTimeFormat(referenceDate, options)).toBe('17/04/2020, 6:36:15 am');
+ });
+
+ it.each([
+ ['UTC', '17/04/2020, 12:36:15 pm'],
+ ['Europe/Stockholm', '17/04/2020, 2:36:15 pm'],
+ ['Australia/Perth', '17/04/2020, 8:36:15 pm'],
+ ['Asia/Yakutsk', '17/04/2020, 9:36:15 pm'],
+ ['America/Panama', '17/04/2020, 7:36:15 am'],
+ ['America/Los_Angeles', '17/04/2020, 5:36:15 am'],
+ ['Africa/Djibouti', '17/04/2020, 3:36:15 pm'],
+ ['Europe/London', '17/04/2020, 1:36:15 pm'],
+ ['Europe/Berlin', '17/04/2020, 2:36:15 pm'],
+ ['Europe/Moscow', '17/04/2020, 3:36:15 pm'],
+ ['Europe/Madrid', '17/04/2020, 2:36:15 pm'],
+ ['America/New_York', '17/04/2020, 8:36:15 am'],
+ ['America/Chicago', '17/04/2020, 7:36:15 am'],
+ ['America/Denver', '17/04/2020, 6:36:15 am'],
+ ])('formats with the supplied time zone %s', (timeZone, expected) => {
+ expect(dateTimeFormat(referenceDate, { timeZone })).toBe(expected);
+ });
+
+ it('does not include seconds in the output if the time does not', () => {
+ expect(dateTimeFormat('2020-04-17T12:36:00.000Z')).toBe('17/04/2020, 6:36 am');
+ });
+
+ it("includes milliseconds in the output when 'defaultWithMS' is set to true", () => {
+ expect(dateTimeFormat('2020-04-17T12:36:15.123Z', { defaultWithMS: true })).toBe('17/04/2020, 6:36:15.123 am');
+ });
+
+ it.each([
+ ['en-GB', '17/04/2020, 06:36:15'],
+ ['en-US', '4/17/2020, 6:36:15 AM'],
+ ['fr-FR', '17/04/2020 06:36:15'],
+ ['es-ES', '17/4/2020, 6:36:15'],
+ ['de-DE', '17.4.2020, 06:36:15'],
+ ['pt-BR', '17/04/2020, 06:36:15'],
+ ['zh-Hans', '2020/4/17 06:36:15'],
+ ['it-IT', '17/04/2020, 06:36:15'],
+ ['ja-JP', '2020/4/17 6:36:15'],
+ ['id-ID', '17/4/2020, 06.36.15'],
+ ['ko-KR', '2020. 4. 17. 오전 6:36:15'],
+ ['ru-RU', '17.04.2020, 06:36:15'],
+ ['cs-CZ', '17. 4. 2020 6:36:15'],
+ ['nl-NL', '17-4-2020, 06:36:15'],
+ ['hu-HU', '2020. 04. 17. 6:36:15'],
+ ['pt-PT', '17/04/2020, 06:36:15'],
+ ['pl-PL', '17.04.2020, 06:36:15'],
+ ['sv-SE', '2020-04-17 06:36:15'],
+ ['tr-TR', '17.04.2020 06:36:15'],
+ ['zh-Hant', '2020/4/17 上午6:36:15'],
+ ])('with locale %s', (locale, expected) => {
+ initRegionalFormatForTests(locale);
+
+ expect(dateTimeFormat(referenceDate)).toBe(expected);
+ });
+});
+
describe('dateTimeFormat', () => {
describe('when no time zone have been set', () => {
const browserTime = dateTimeFormat(1587126975779, { timeZone: 'browser' });
@@ -81,7 +166,7 @@ describe('dateTimeFormat', () => {
});
});
- describe('DateTimeFormatISO', () => {
+ describe('with custom ISO format', () => {
it('should format according to ISO standard', () => {
const options = { timeZone: 'Europe/Stockholm', format: 'YYYY-MM-DDTHH:mm:ss.SSSZ' };
expect(dateTimeFormat(1587126975779, options)).toBe('2020-04-17T14:36:15.779+02:00');
@@ -95,39 +180,41 @@ describe('dateTimeFormat', () => {
expect(dateTimeFormat(1587126975779, options)).toBe('2020-04-17T14:36:15.779+02:00');
});
});
+});
- describe('dateTimeFormatTimeAgo', () => {
- it('should return the correct format for years ago', () => {
- const options = { timeZone: 'Europe/Stockholm' };
- expect(dateTimeFormatTimeAgo(1587126975779, options)).toContain('years ago');
- });
+describe('dateTimeFormatTimeAgo', () => {
+ it('should return the correct format for years ago', () => {
+ const options = { timeZone: 'Europe/Stockholm' };
+ expect(dateTimeFormatTimeAgo(1587126975779, options)).toContain('years ago');
});
- describe('dateTimeFormatWithAbbreviation', () => {
- it('should return the correct format with zone abbreviation', () => {
- const options = { timeZone: 'Europe/Stockholm' };
- expect(dateTimeFormatWithAbbrevation(1587126975779, options)).toBe('2020-04-17 14:36:15 CEST');
- });
- it('should return the correct format with zone abbreviation', () => {
- const options = { timeZone: 'America/New_York' };
- expect(dateTimeFormatWithAbbrevation(1587126975779, options)).toBe('2020-04-17 08:36:15 EDT');
- });
- it('should return the correct format with zone abbreviation', () => {
- const options = { timeZone: 'Europe/Bucharest' };
- expect(dateTimeFormatWithAbbrevation(1587126975779, options)).toBe('2020-04-17 15:36:15 EEST');
- });
+});
+
+describe('dateTimeFormatWithAbbreviation', () => {
+ it('should return the correct format with zone abbreviation', () => {
+ const options = { timeZone: 'Europe/Stockholm' };
+ expect(dateTimeFormatWithAbbrevation(1587126975779, options)).toBe('2020-04-17 14:36:15 CEST');
});
- describe('timeZoneAbbrevation', () => {
- it('should return the correct abbreviation', () => {
- const options = { timeZone: 'Europe/Stockholm' };
- expect(timeZoneAbbrevation(1587126975779, options)).toBe('CEST');
- });
- it('should return the correct abbreviation', () => {
- const options = { timeZone: 'America/New_York' };
- expect(timeZoneAbbrevation(1587126975779, options)).toBe('EDT');
- });
- it('should return the correct abbreviation', () => {
- const options = { timeZone: 'Europe/Bucharest' };
- expect(timeZoneAbbrevation(1587126975779, options)).toBe('EEST');
- });
+ it('should return the correct format with zone abbreviation', () => {
+ const options = { timeZone: 'America/New_York' };
+ expect(dateTimeFormatWithAbbrevation(1587126975779, options)).toBe('2020-04-17 08:36:15 EDT');
+ });
+ it('should return the correct format with zone abbreviation', () => {
+ const options = { timeZone: 'Europe/Bucharest' };
+ expect(dateTimeFormatWithAbbrevation(1587126975779, options)).toBe('2020-04-17 15:36:15 EEST');
+ });
+});
+
+describe('timeZoneAbbrevation', () => {
+ it('should return the correct abbreviation', () => {
+ const options = { timeZone: 'Europe/Stockholm' };
+ expect(timeZoneAbbrevation(1587126975779, options)).toBe('CEST');
+ });
+ it('should return the correct abbreviation', () => {
+ const options = { timeZone: 'America/New_York' };
+ expect(timeZoneAbbrevation(1587126975779, options)).toBe('EDT');
+ });
+ it('should return the correct abbreviation', () => {
+ const options = { timeZone: 'Europe/Bucharest' };
+ expect(timeZoneAbbrevation(1587126975779, options)).toBe('EEST');
});
});
diff --git a/packages/grafana-data/src/datetime/formatter.ts b/packages/grafana-data/src/datetime/formatter.ts
index 7facb730195..cc90e27491a 100644
--- a/packages/grafana-data/src/datetime/formatter.ts
+++ b/packages/grafana-data/src/datetime/formatter.ts
@@ -1,12 +1,77 @@
/* eslint-disable id-blacklist, no-restricted-imports */
import moment, { Moment } from 'moment-timezone';
+import { formatDate } from '@grafana/i18n';
+
import { TimeZone } from '../types/time';
+import { getFeatureToggle } from '../utils/featureToggles';
import { DateTimeOptions, getTimeZone } from './common';
import { systemDateFormats } from './formats';
import { DateTimeInput, toUtc, dateTimeAsMoment } from './moment_wrapper';
+/**
+ * Converts a Grafana DateTimeInput to a plain Javascript Date object.
+ */
+function toDate(dateInUtc: DateTimeInput): Date {
+ if (dateInUtc instanceof Date) {
+ return dateInUtc;
+ }
+
+ if (typeof dateInUtc === 'string' || typeof dateInUtc === 'number') {
+ return new Date(dateInUtc);
+ }
+
+ return dateTimeAsMoment(dateInUtc).toDate();
+}
+
+/**
+ * Converts a Grafana timezone string to an IANA timezone string.
+ */
+export function toIANATimezone(grafanaTimezone: string) {
+ // Intl APIs will use the browser's timezone by default (if tz is undefined)
+ if (grafanaTimezone === 'browser') {
+ return undefined;
+ }
+
+ const zone = moment.tz.zone(grafanaTimezone);
+ if (!zone) {
+ // If the timezone is invalid, we default to the browser's timezone
+ return undefined;
+ }
+
+ return grafanaTimezone;
+}
+
+function getIntlOptions(
+ date: Date,
+ options?: DateTimeOptionsWithFormat
+): Intl.DateTimeFormatOptions & { timeZone?: string } {
+ const timeZone = getTimeZone(options);
+
+ const intlOptions: Intl.DateTimeFormatOptions = {
+ year: 'numeric', // ↔ dateStyle: 'short'
+ month: 'numeric',
+ day: 'numeric',
+ hour: 'numeric', // ↔ timeStyle: 'short'
+ minute: 'numeric',
+ timeZone: toIANATimezone(timeZone),
+ };
+
+ // If the time has seconds, ensure they're included in the format
+ const hasSeconds = date.getSeconds() !== 0;
+ if (hasSeconds) {
+ intlOptions.second = 'numeric';
+ }
+
+ if (options?.defaultWithMS) {
+ intlOptions.second = 'numeric';
+ intlOptions.fractionalSecondDigits = 3; // Include milliseconds
+ }
+
+ return intlOptions;
+}
+
/**
* The type describing the options that can be passed to the {@link dateTimeFormat}
* helper function to control how the date and time value passed to the function is
@@ -23,17 +88,30 @@ export interface DateTimeOptionsWithFormat extends DateTimeOptions {
type DateTimeFormatter = (dateInUtc: DateTimeInput, options?: T) => string;
+// NOTE:
+// These date formatting functions now just wrap the @grafana/i18n formatting functions
+// (which themselves wrap the browserIntl APIs). In the future we may deprecate these
+// in favor of using @grafana/i18n directly.
+
/**
- * Helper function to format date and time according to the specified options. If no options
- * are supplied, then default values are used. For more details, see {@link DateTimeOptionsWithFormat}.
+ * Helper function to format date and time according to the specified options.
+ * If no options are supplied, then the date is formatting according to the user's locale preference.
*
* @param dateInUtc - date in UTC format, e.g. string formatted with UTC offset, UNIX epoch in seconds etc.
* @param options
*
* @public
*/
-export const dateTimeFormat: DateTimeFormatter = (dateInUtc, options?) =>
- toTz(dateInUtc, getTimeZone(options)).format(getFormat(options));
+export const dateTimeFormat: DateTimeFormatter = (dateInUtc, options?) => {
+ // If a custom format is provided (or the toggle isn't enabled), use the previous implementation
+ if (!getFeatureToggle('localeFormatPreference') || options?.format) {
+ return toTz(dateInUtc, getTimeZone(options)).format(getFormat(options));
+ }
+
+ const dateAsDate = toDate(dateInUtc);
+ const intlOptions = getIntlOptions(dateAsDate, options); // TODO - if invalid timezone, use browser timezone
+ return formatDate(dateAsDate, intlOptions);
+};
/**
* Helper function to format date and time according to the standard ISO format e.g. 2013-02-04T22:44:30.652Z.
@@ -70,8 +148,18 @@ export const dateTimeFormatTimeAgo: DateTimeFormatter = (dateInUtc, options?) =>
*
* @public
*/
-export const dateTimeFormatWithAbbrevation: DateTimeFormatter = (dateInUtc, options?) =>
- toTz(dateInUtc, getTimeZone(options)).format(`${systemDateFormats.fullDate} z`);
+export const dateTimeFormatWithAbbrevation: DateTimeFormatter = (dateInUtc, options?) => {
+ // If a custom format is provided (or the toggle isn't enabled), use the previous implementation
+ if (!getFeatureToggle('localeFormatPreference') || options?.format) {
+ return toTz(dateInUtc, getTimeZone(options)).format(`${systemDateFormats.fullDate} z`);
+ }
+
+ const dateAsDate = toDate(dateInUtc);
+ const intlOptions = getIntlOptions(dateAsDate, options);
+ intlOptions.timeZoneName = 'short';
+
+ return formatDate(dateAsDate, intlOptions);
+};
/**
* Helper function to return only the time zone abbreviation for a given date and time value. If no options
diff --git a/packages/grafana-data/src/datetime/moment_wrapper.ts b/packages/grafana-data/src/datetime/moment_wrapper.ts
index 4b5bfc44290..0120e016d56 100644
--- a/packages/grafana-data/src/datetime/moment_wrapper.ts
+++ b/packages/grafana-data/src/datetime/moment_wrapper.ts
@@ -1,4 +1,5 @@
import moment, { Moment, MomentInput, DurationInputArg1, DurationInputArg2 } from 'moment';
+import { tz } from 'moment-timezone';
import { TimeZone } from '../types/time';
/* eslint-disable id-blacklist, no-restricted-imports */
@@ -130,9 +131,9 @@ export const dateTimeForTimeZone = (
let result: moment.Moment;
if (typeof input === 'string' && formatInput) {
- result = moment.tz(input, formatInput, timezone);
+ result = tz(input, formatInput, timezone);
} else {
- result = moment.tz(input, timezone);
+ result = tz(input, timezone);
}
if (isDateTime(result)) {
diff --git a/packages/grafana-data/src/datetime/rangeutil.test.ts b/packages/grafana-data/src/datetime/rangeutil.test.ts
index 684e4a11935..81ac6e2f6f8 100644
--- a/packages/grafana-data/src/datetime/rangeutil.test.ts
+++ b/packages/grafana-data/src/datetime/rangeutil.test.ts
@@ -1,9 +1,13 @@
+import { initRegionalFormatForTests } from '@grafana/i18n';
+
import { RawTimeRange, TimeRange } from '../types/time';
+import * as featureToggles from '../utils/featureToggles';
import { dateTime } from './moment_wrapper';
import {
convertRawToRange,
describeInterval,
+ describeTimeRange,
isRelativeTimeRange,
relativeToTimeRange,
roundInterval,
@@ -310,4 +314,180 @@ describe('Range Utils', () => {
expect(relativeTimeRange.to).toEqual(604800);
});
});
+
+ describe('describeTimeRange', () => {
+ it.each([
+ ['now-5m', 'now', 'Last 5 minutes'],
+ ['now-15m', 'now', 'Last 15 minutes'],
+ ['now-1h', 'now', 'Last 1 hour'],
+ ['now-24h', 'now', 'Last 24 hours'],
+ ['now-7d', 'now', 'Last 7 days'],
+ ['now-30d', 'now', 'Last 30 days'],
+ ['now/d', 'now/d', 'Today'],
+ ['now/d', 'now', 'Today so far'],
+ ['now/w', 'now/w', 'This week'],
+ ['now/M', 'now/M', 'This month'],
+ ['now/y', 'now/y', 'This year'],
+ ['now-1d/d', 'now-1d/d', 'Yesterday'],
+ ['now-1w/w', 'now-1w/w', 'Previous week'],
+ ['now-1M/M', 'now-1M/M', 'Previous month'],
+ ['now-1y/y', 'now-1y/y', 'Previous year'],
+ ['now/fQ', 'now/fQ', 'This fiscal quarter'],
+ ['now/fy', 'now/fy', 'This fiscal year'],
+ ['now-1Q/fQ', 'now-1Q/fQ', 'Previous fiscal quarter'],
+ ['now-1y/fy', 'now-1y/fy', 'Previous fiscal year'],
+ ])('should return display name "%s" for range from "%s" to "%s"', (from, to, expected) => {
+ expect(describeTimeRange({ from, to })).toBe(expected);
+ });
+
+ it('should prioritize custom quick ranges over standard ranges', () => {
+ const customRanges = [{ from: 'now-5m', to: 'now', display: 'Lightning round!' }];
+
+ expect(describeTimeRange({ from: 'now-5m', to: 'now' }, undefined, customRanges)).toBe('Lightning round!');
+ });
+
+ it('should format with the default timezone', () => {
+ // Tests default to Pacific/Easter
+ const from = dateTime('2023-01-15T10:30:00Z');
+ const to = dateTime('2023-01-15T14:45:00Z');
+
+ const result = describeTimeRange({ from, to });
+ expect(result).toBe('2023-01-15 05:30:00 to 2023-01-15 09:45:00');
+ });
+
+ it('should respect timezone in datetime formatting', () => {
+ const from = dateTime('2023-01-15T10:30:00Z');
+ const to = dateTime('2023-01-15T14:45:00Z');
+
+ const result = describeTimeRange({ from, to }, 'Australia/Sydney');
+ expect(result).toBe('2023-01-15 21:30:00 to 2023-01-16 01:45:00');
+ });
+
+ it('should handle absolute from, relative to', () => {
+ const from = dateTime('2023-01-15T10:30:00Z');
+ const to = 'now';
+
+ const result = describeTimeRange({ from, to });
+ expect(result).toBe('2023-01-15 05:30:00 to a few seconds ago');
+ });
+
+ it('should handle relative from, absolute to', () => {
+ const from = 'now-1h';
+ const to = dateTime('2023-01-15T14:45:00Z');
+
+ const result = describeTimeRange({ from, to });
+ expect(result).toBe('an hour ago to 2023-01-15 09:45:00');
+ });
+
+ it('should handle invalid relative expressions', () => {
+ const from = dateTime('2023-01-15T10:30:00Z');
+ const to = 'invalid-expression';
+
+ const result = describeTimeRange({ from, to });
+ expect(result).toContain('Invalid date');
+ });
+
+ it('should handle empty custom ranges array', () => {
+ expect(describeTimeRange({ from: 'now-5m', to: 'now' }, undefined, [])).toBe('Last 5 minutes');
+ });
+
+ it('should handle null custom ranges', () => {
+ expect(describeTimeRange({ from: 'now-5m', to: 'now' }, undefined, undefined)).toBe('Last 5 minutes');
+ });
+ });
+
+ describe('describeTimeRange - localeFormatPreference enabled', () => {
+ let mockGetFeatureToggle: jest.SpyInstance;
+
+ beforeAll(() => {
+ initRegionalFormatForTests('en-AU');
+ mockGetFeatureToggle = jest.spyOn(featureToggles, 'getFeatureToggle').mockImplementation((featureName) => {
+ return featureName === 'localeFormatPreference';
+ });
+ });
+
+ afterAll(() => {
+ mockGetFeatureToggle.mockRestore();
+ });
+
+ it.each([
+ ['now-5m', 'now', 'Last 5 minutes'],
+ ['now-15m', 'now', 'Last 15 minutes'],
+ ['now-1h', 'now', 'Last 1 hour'],
+ ['now-7d', 'now', 'Last 7 days'],
+ ['now/d', 'now/d', 'Today'],
+ ['now/d', 'now', 'Today so far'],
+ ['now/w', 'now/w', 'This week'],
+ ['now-1d/d', 'now-1d/d', 'Yesterday'],
+ ['now-1w/w', 'now-1w/w', 'Previous week'],
+ ['now-1y/y', 'now-1y/y', 'Previous year'],
+ ['now/fQ', 'now/fQ', 'This fiscal quarter'],
+ ['now-1Q/fQ', 'now-1Q/fQ', 'Previous fiscal quarter'],
+ ])('should return display name "%s" for range from "%s" to "%s"', (from, to, expected) => {
+ expect(describeTimeRange({ from, to })).toBe(expected);
+ });
+
+ it('should prioritize custom quick ranges over standard ranges', () => {
+ const customRanges = [{ from: 'now-5m', to: 'now', display: 'Lightning round!' }];
+
+ expect(describeTimeRange({ from: 'now-5m', to: 'now' }, undefined, customRanges)).toBe('Lightning round!');
+ });
+
+ it('should format with the default timezone', () => {
+ // Tests default to Pacific/Easter
+ const from = dateTime('2023-01-15T10:30:00Z');
+ const to = dateTime('2023-01-15T14:45:00Z');
+
+ const result = describeTimeRange({ from, to });
+ expect(result).toBe('15/1/23, 5:30 – 9:45 am');
+ });
+
+ it('should respect timezone in datetime formatting', () => {
+ const from = dateTime('2023-01-15T10:30:00Z');
+ const to = dateTime('2023-01-15T14:45:00Z');
+
+ const result = describeTimeRange({ from, to }, 'Australia/Sydney');
+ expect(result).toBe('15/1/23, 9:30 pm – 16/1/23, 1:45 am');
+ });
+
+ it('should include seconds in the output if the time has seconds', () => {
+ const from = dateTime('2023-01-15T10:30:00Z');
+ const to = dateTime('2023-01-15T14:45:12Z');
+
+ const result = describeTimeRange({ from, to });
+ expect(result).toBe('15/1/23, 5:30:00 am – 9:45:12 am');
+ });
+
+ it('should handle absolute from, relative to', () => {
+ const from = dateTime('2023-01-15T10:30:00Z');
+ const to = 'now';
+
+ const result = describeTimeRange({ from, to });
+ expect(result).toBe('15/01/2023, 5:30 am to a few seconds ago');
+ });
+
+ it('should handle relative from, absolute to', () => {
+ const from = 'now-1h';
+ const to = dateTime('2023-01-15T14:45:00Z');
+
+ const result = describeTimeRange({ from, to });
+ expect(result).toBe('an hour ago to 15/01/2023, 9:45 am');
+ });
+
+ it('should handle invalid relative expressions', () => {
+ const from = dateTime('2023-01-15T10:30:00Z');
+ const to = 'invalid-expression';
+
+ const result = describeTimeRange({ from, to });
+ expect(result).toContain('Invalid date');
+ });
+
+ it('should handle empty custom ranges array', () => {
+ expect(describeTimeRange({ from: 'now-5m', to: 'now' }, undefined, [])).toBe('Last 5 minutes');
+ });
+
+ it('should handle null custom ranges', () => {
+ expect(describeTimeRange({ from: 'now-5m', to: 'now' }, undefined, undefined)).toBe('Last 5 minutes');
+ });
+ });
});
diff --git a/packages/grafana-data/src/datetime/rangeutil.ts b/packages/grafana-data/src/datetime/rangeutil.ts
index 2a93c282551..680ce22dcf0 100644
--- a/packages/grafana-data/src/datetime/rangeutil.ts
+++ b/packages/grafana-data/src/datetime/rangeutil.ts
@@ -1,7 +1,10 @@
+import { formatDateRange } from '@grafana/i18n';
+
import { RawTimeRange, TimeRange, TimeZone, IntervalValues, RelativeTimeRange, TimeOption } from '../types/time';
+import { getFeatureToggle } from '../utils/featureToggles';
import * as dateMath from './datemath';
-import { timeZoneAbbrevation, dateTimeFormat, dateTimeFormatTimeAgo } from './formatter';
+import { timeZoneAbbrevation, dateTimeFormat, dateTimeFormatTimeAgo, toIANATimezone } from './formatter';
import { isDateTime, DateTime, dateTime } from './moment_wrapper';
import { dateTimeParse } from './parser';
@@ -134,6 +137,17 @@ export function describeTextRange(expr: string): TimeOption {
return opt;
}
+// TODO: Should we keep these format presets somewhere common?
+const rangeFormatShort: Intl.DateTimeFormatOptions = {
+ dateStyle: 'short',
+ timeStyle: 'short',
+};
+
+const rangeFormatFull: Intl.DateTimeFormatOptions = {
+ dateStyle: 'short',
+ timeStyle: 'medium',
+};
+
/**
* Use this function to get a properly formatted string representation of a {@link @grafana/data:RawTimeRange | range}.
*
@@ -154,9 +168,25 @@ export function describeTimeRange(range: RawTimeRange, timeZone?: TimeZone, quic
const options = { timeZone };
if (isDateTime(range.from) && isDateTime(range.to)) {
- return dateTimeFormat(range.from, options) + ' to ' + dateTimeFormat(range.to, options);
+ const fromDate = range.from.toDate();
+ const toDate = range.to.toDate();
+
+ if (!getFeatureToggle('localeFormatPreference')) {
+ return dateTimeFormat(range.from, options) + ' to ' + dateTimeFormat(range.to, options);
+ }
+
+ const hasSeconds = fromDate.getSeconds() !== 0 || toDate.getSeconds() !== 0;
+ const intlFormat = hasSeconds ? rangeFormatFull : rangeFormatShort;
+ const intlFormatOptions = {
+ ...intlFormat,
+ timeZone: timeZone ? toIANATimezone(timeZone) : undefined,
+ };
+
+ return formatDateRange(fromDate, toDate, intlFormatOptions);
}
+ // TODO: We could update these to all use Intl APIs.
+ // Could we use formatRangeToParts and replace the 'other side' with the ago formatting?
if (isDateTime(range.from)) {
const parsed = dateMath.parse(range.to, true, 'utc');
return parsed ? dateTimeFormat(range.from, options) + ' to ' + dateTimeFormatTimeAgo(parsed, options) : '';
diff --git a/packages/grafana-data/src/field/fieldComparers.ts b/packages/grafana-data/src/field/fieldComparers.ts
index 94bb4312b14..7b3e64bbc6e 100644
--- a/packages/grafana-data/src/field/fieldComparers.ts
+++ b/packages/grafana-data/src/field/fieldComparers.ts
@@ -17,9 +17,9 @@ export const fieldIndexComparer = (field: Field, reverse = false): IndexComparer
return booleanIndexComparer(values, reverse);
case FieldType.time:
if (typeof field.values[0] === 'number') {
- return timestampIndexComparer(values, reverse);
+ return timestampIndexComparer(values, reverse, field.nanos);
}
- return timeIndexComparer(values, reverse);
+ return timeIndexComparer(values, reverse, field.nanos);
default:
return naturalIndexComparer(reverse);
}
@@ -79,17 +79,24 @@ const falsyComparer = (a: unknown, b: unknown): number => {
return 0;
};
-const timestampIndexComparer = (values: number[], reverse: boolean): IndexComparer => {
+const timestampIndexComparer = (values: number[], reverse: boolean, nanos?: number[]): IndexComparer => {
let mult = reverse ? -1 : 1;
+
+ if (nanos !== undefined) {
+ return (a: number, b: number): number => mult * (values[a] - values[b] || nanos[a] - nanos[b]);
+ }
+
return (a: number, b: number): number => mult * (values[a] - values[b]);
};
-const timeIndexComparer = (values: unknown[], reverse: boolean): IndexComparer => {
- return (a: number, b: number): number => {
- const vA = values[a];
- const vB = values[b];
- return reverse ? timeComparer(vB, vA) : timeComparer(vA, vB);
- };
+const timeIndexComparer = (values: unknown[], reverse: boolean, nanos?: number[]): IndexComparer => {
+ const mult = reverse ? -1 : 1;
+
+ if (nanos !== undefined) {
+ return (a: number, b: number): number => mult * (timeComparer(values[a], values[b]) || nanos[a] - nanos[b]);
+ }
+
+ return (a: number, b: number): number => mult * timeComparer(values[a], values[b]);
};
const booleanIndexComparer = (values: boolean[], reverse: boolean): IndexComparer => {
diff --git a/packages/grafana-data/src/index.ts b/packages/grafana-data/src/index.ts
index 2fced788c3e..b767026c7a2 100644
--- a/packages/grafana-data/src/index.ts
+++ b/packages/grafana-data/src/index.ts
@@ -660,6 +660,7 @@ export {
type QueryFixAction,
type QueryHint,
type MetricFindValue,
+ type FiltersApplicability,
type DataSourceJsonData,
type DataSourceSettings,
type DataSourceInstanceSettings,
diff --git a/packages/grafana-data/src/types/datasource.ts b/packages/grafana-data/src/types/datasource.ts
index 416855f5c95..16b0dfe79a1 100644
--- a/packages/grafana-data/src/types/datasource.ts
+++ b/packages/grafana-data/src/types/datasource.ts
@@ -309,7 +309,7 @@ abstract class DataSourceApi<
/**
* Verify adhoc filters applicability based on queries and current filters
*/
- getApplicableFilters?(options?: DataSourceGetTagKeysOptions): Promise;
+ getFiltersApplicability?(options?: DataSourceGetTagKeysOptions): Promise;
/**
* Get tag keys for adhoc filters
@@ -643,6 +643,16 @@ export interface MetricFindValue {
expandable?: boolean;
}
+export interface FiltersApplicability {
+ key: string;
+ applicable: boolean;
+ // message explaining why the filter is not applicable
+ reason?: string;
+ // needed to differentiate between filters with same key
+ // but different origin
+ origin?: string;
+}
+
export interface DataSourceJsonData {
authType?: string;
defaultRegion?: string;
diff --git a/packages/grafana-data/src/types/featureToggles.gen.ts b/packages/grafana-data/src/types/featureToggles.gen.ts
index 1f42c837828..c82fffa8ea5 100644
--- a/packages/grafana-data/src/types/featureToggles.gen.ts
+++ b/packages/grafana-data/src/types/featureToggles.gen.ts
@@ -166,11 +166,6 @@ export interface FeatureToggles {
*/
pluginsFrontendSandbox?: boolean;
/**
- * Enables right panel for the plugins details page
- * @default true
- */
- pluginsDetailsRightPanel?: boolean;
- /**
* Enables previous SQL data source dataset dropdown behavior
*/
sqlDatasourceDatabaseSelection?: boolean;
@@ -257,11 +252,6 @@ export interface FeatureToggles {
*/
lokiRunQueriesInParallel?: boolean;
/**
- * Allow core plugins to be loaded as external
- * @default true
- */
- externalCorePlugins?: boolean;
- /**
* Automatic service account and token setup for plugins
*/
externalServiceAccounts?: boolean;
@@ -292,6 +282,10 @@ export interface FeatureToggles {
*/
kubernetesLibraryPanels?: boolean;
/**
+ * Routes library panel connections requests from /api to using search
+ */
+ kubernetesLibraryPanelConnections?: boolean;
+ /**
* Use the kubernetes API in the frontend for dashboards
*/
kubernetesDashboards?: boolean;
@@ -354,6 +348,10 @@ export interface FeatureToggles {
*/
alertmanagerRemoteSecondary?: boolean;
/**
+ * Enables a feature to avoid issues with concurrent writes to the alerting provenance table in MySQL
+ */
+ alertingProvenanceLockWrites?: boolean;
+ /**
* Enable Grafana to have a remote Alertmanager instance as the primary Alertmanager.
*/
alertmanagerRemotePrimary?: boolean;
@@ -398,6 +396,10 @@ export interface FeatureToggles {
*/
canvasPanelPanZoom?: boolean;
/**
+ * Enables time comparison option in supported panels
+ */
+ timeComparison?: boolean;
+ /**
* Enables infinite scrolling for the Logs panel in Explore and Dashboards
* @default true
*/
@@ -474,6 +476,10 @@ export interface FeatureToggles {
*/
sqlExpressions?: boolean;
/**
+ * Enables column autocomplete for SQL Expressions
+ */
+ sqlExpressionsColumnAutoComplete?: boolean;
+ /**
* Enables the group to nested table transformation
* @default true
*/
@@ -749,6 +755,11 @@ export interface FeatureToggles {
*/
alertingAIGenAlertRules?: boolean;
/**
+ * Enable AI-generated feedback from the Grafana UI.
+ * @default false
+ */
+ alertingAIFeedback?: boolean;
+ /**
* Enable AI-improve alert rules labels and annotations.
* @default false
*/
@@ -848,10 +859,6 @@ export interface FeatureToggles {
*/
grafanaconThemes?: boolean;
/**
- * Loads plugins from CDN synchronously
- */
- pluginsCDNSyncLoader?: boolean;
- /**
* Enables the new Jira integration for contact points in cloud alert managers.
*/
alertingJiraIntegration?: boolean;
@@ -988,6 +995,10 @@ export interface FeatureToggles {
*/
kubernetesAuthzApis?: boolean;
/**
+ * Enables create, delete, and update mutations for resources owned by IAM identity
+ */
+ kubernetesAuthnMutation?: boolean;
+ /**
* Enables restore deleted dashboards feature
* @default false
*/
@@ -1055,4 +1066,17 @@ export interface FeatureToggles {
* @default false
*/
pluginAssetProvider?: boolean;
+ /**
+ * Enable dual reader for unified storage search
+ */
+ unifiedStorageSearchDualReaderEnabled?: boolean;
+ /**
+ * Enables adhoc filtering support for the dashboard datasource
+ */
+ dashboardDsAdHocFiltering?: boolean;
+ /**
+ * Starts Grafana in remote secondary mode pulling the latest state from the remote Alertmanager to avoid duplicate notifications.
+ * @default false
+ */
+ alertmanagerRemoteSecondaryWithRemoteState?: boolean;
}
diff --git a/packages/grafana-data/src/types/icon.ts b/packages/grafana-data/src/types/icon.ts
index 79df07aae5a..0cb4a61a25b 100644
--- a/packages/grafana-data/src/types/icon.ts
+++ b/packages/grafana-data/src/types/icon.ts
@@ -274,6 +274,8 @@ export const availableIconsIndex = {
attach: true,
'dollar-alt': true,
'ai-sparkle': true,
+ bitbucket: true,
+ git: true,
};
export type IconName = keyof typeof availableIconsIndex;
diff --git a/packages/grafana-data/src/utils/featureToggles.ts b/packages/grafana-data/src/utils/featureToggles.ts
new file mode 100644
index 00000000000..125c8fa8536
--- /dev/null
+++ b/packages/grafana-data/src/utils/featureToggles.ts
@@ -0,0 +1,13 @@
+import { FeatureToggles } from '../types/featureToggles.gen';
+
+type FeatureToggleName = keyof FeatureToggles;
+
+/**
+ * Check a featureToggle
+ * @param featureName featureToggle name
+ * @param def default value if featureToggles aren't defined, false if not provided
+ * @returns featureToggle value or def.
+ */
+export function getFeatureToggle(featureName: FeatureToggleName, def = false) {
+ return window.grafanaBootData?.settings.featureToggles[featureName] ?? def;
+}
diff --git a/packages/grafana-data/src/utils/namedColorsPalette.ts b/packages/grafana-data/src/utils/namedColorsPalette.ts
index 6d798ec96af..ab47afbb115 100644
--- a/packages/grafana-data/src/utils/namedColorsPalette.ts
+++ b/packages/grafana-data/src/utils/namedColorsPalette.ts
@@ -1,3 +1,7 @@
+/**
+ * @deprecated
+ * This is defined on the theme object now. Use `theme.visualization.palette` instead.
+ */
export const classicColors = [
'#7EB26D', // 0: pale green
'#EAB839', // 1: mustard
diff --git a/packages/grafana-data/src/valueFormats/categories.ts b/packages/grafana-data/src/valueFormats/categories.ts
index e1e1bdf51ba..6eb64037208 100644
--- a/packages/grafana-data/src/valueFormats/categories.ts
+++ b/packages/grafana-data/src/valueFormats/categories.ts
@@ -1,3 +1,5 @@
+import { t } from '@grafana/i18n';
+
import { toHex, sci, toHex0x, toPercent, toPercentUnit } from './arithmeticFormatters';
import {
dateTimeAsIso,
@@ -36,408 +38,1546 @@ import {
export const getCategories = (): ValueFormatCategory[] => [
{
- name: 'Misc',
+ name: t('grafana-data.valueFormats.categories.misc.name', 'Misc'),
formats: [
- { name: 'Number', id: 'none', fn: toFixedUnit('') },
- { name: 'String', id: 'string', fn: stringFormater },
{
- name: 'short',
+ name: t('grafana-data.valueFormats.categories.misc.formats.name-number', 'Number'),
+ id: 'none',
+ fn: toFixedUnit(''),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.misc.formats.name-string', 'String'),
+ id: 'string',
+ fn: stringFormater,
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.misc.formats.name-short', 'short'),
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') },
- { name: 'Decibel', id: 'dB', fn: toFixedUnit('dB') },
- { name: 'Candela (cd)', id: 'candela', fn: SIPrefix('cd') },
- { name: 'Hexadecimal (0x)', id: 'hex0x', fn: toHex0x },
- { name: 'Hexadecimal', id: 'hex', fn: toHex },
- { name: 'Scientific notation', id: 'sci', fn: sci },
- { name: 'Locale format', id: 'locale', fn: locale },
- { name: 'Pixels', id: 'pixel', fn: toFixedUnit('px') },
- ],
- },
- {
- name: 'Acceleration',
- formats: [
- { name: 'Meters/sec²', id: 'accMS2', fn: toFixedUnit('m/sec²') },
- { name: 'Feet/sec²', id: 'accFS2', fn: toFixedUnit('f/sec²') },
- { name: 'G unit', id: 'accG', fn: toFixedUnit('g') },
- ],
- },
- {
- name: 'Angle',
- formats: [
- { name: 'Degrees (°)', id: 'degree', fn: toFixedUnit('°') },
- { name: 'Radians', id: 'radian', fn: toFixedUnit('rad') },
- { name: 'Gradian', id: 'grad', fn: toFixedUnit('grad') },
- { name: 'Arc Minutes', id: 'arcmin', fn: toFixedUnit('arcmin') },
- { name: 'Arc Seconds', id: 'arcsec', fn: toFixedUnit('arcsec') },
- ],
- },
- {
- name: 'Area',
- formats: [
- { name: 'Square Meters (m²)', id: 'areaM2', fn: toFixedUnit('m²') },
- { name: 'Square Feet (ft²)', id: 'areaF2', fn: toFixedUnit('ft²') },
- { name: 'Square Miles (mi²)', id: 'areaMI2', fn: toFixedUnit('mi²') },
- { name: 'Acres (ac)', id: 'acres', fn: toFixedUnit('ac') },
- { name: 'Hectares (ha)', id: 'hectares', fn: toFixedUnit('ha') },
- ],
- },
- {
- name: 'Computation',
- formats: [
- { name: 'FLOP/s', id: 'flops', fn: SIPrefix('FLOPS') },
- { name: 'MFLOP/s', id: 'mflops', fn: SIPrefix('FLOPS', 2) },
- { name: 'GFLOP/s', id: 'gflops', fn: SIPrefix('FLOPS', 3) },
- { name: 'TFLOP/s', id: 'tflops', fn: SIPrefix('FLOPS', 4) },
- { name: 'PFLOP/s', id: 'pflops', fn: SIPrefix('FLOPS', 5) },
- { name: 'EFLOP/s', id: 'eflops', fn: SIPrefix('FLOPS', 6) },
- { name: 'ZFLOP/s', id: 'zflops', fn: SIPrefix('FLOPS', 7) },
- { name: 'YFLOP/s', id: 'yflops', fn: SIPrefix('FLOPS', 8) },
- ],
- },
- {
- name: 'Concentration',
- formats: [
- { name: 'parts-per-million (ppm)', id: 'ppm', fn: toFixedUnit('ppm') },
- { name: 'parts-per-billion (ppb)', id: 'conppb', fn: toFixedUnit('ppb') },
- { name: 'nanogram per cubic meter (ng/m³)', id: 'conngm3', fn: toFixedUnit('ng/m³') },
- { name: 'nanogram per normal cubic meter (ng/Nm³)', id: 'conngNm3', fn: toFixedUnit('ng/Nm³') },
- { name: 'microgram per cubic meter (μg/m³)', id: 'conμgm3', fn: toFixedUnit('μg/m³') },
- { name: 'microgram per normal cubic meter (μg/Nm³)', id: 'conμgNm3', fn: toFixedUnit('μg/Nm³') },
- { name: 'milligram per cubic meter (mg/m³)', id: 'conmgm3', fn: toFixedUnit('mg/m³') },
- { name: 'milligram per normal cubic meter (mg/Nm³)', id: 'conmgNm3', fn: toFixedUnit('mg/Nm³') },
- { name: 'gram per cubic meter (g/m³)', id: 'congm3', fn: toFixedUnit('g/m³') },
- { name: 'gram per normal cubic meter (g/Nm³)', id: 'congNm3', fn: toFixedUnit('g/Nm³') },
- { name: 'milligrams per decilitre (mg/dL)', id: 'conmgdL', fn: toFixedUnit('mg/dL') },
- { name: 'millimoles per litre (mmol/L)', id: 'conmmolL', fn: toFixedUnit('mmol/L') },
- ],
- },
- {
- name: 'Currency',
- formats: [
- { name: 'Dollars ($)', id: 'currencyUSD', fn: currency('$') },
- { name: 'Pounds (£)', id: 'currencyGBP', fn: currency('£') },
- { name: 'Euro (€)', id: 'currencyEUR', fn: currency('€') },
- { name: 'Yen (¥)', id: 'currencyJPY', fn: currency('¥') },
- { name: 'Rubles (₽)', id: 'currencyRUB', fn: currency('₽') },
- { name: 'Hryvnias (₴)', id: 'currencyUAH', fn: currency('₴') },
- { name: 'Real (R$)', id: 'currencyBRL', fn: currency('R$') },
- { name: 'Danish Krone (kr)', id: 'currencyDKK', fn: currency('kr', true) },
- { name: 'Icelandic Króna (kr)', id: 'currencyISK', fn: currency('kr', true) },
- { name: 'Norwegian Krone (kr)', id: 'currencyNOK', fn: currency('kr', true) },
- { name: 'Swedish Krona (kr)', id: 'currencySEK', fn: currency('kr', true) },
- { name: 'Czech koruna (czk)', id: 'currencyCZK', fn: currency('czk') },
- { name: 'Swiss franc (CHF)', id: 'currencyCHF', fn: currency('CHF') },
- { name: 'Polish Złoty (PLN)', id: 'currencyPLN', fn: currency('PLN') },
- { name: 'Bitcoin (฿)', id: 'currencyBTC', fn: currency('฿') },
- { name: 'Milli Bitcoin (฿)', id: 'currencymBTC', fn: currency('mBTC') },
- { name: 'Micro Bitcoin (฿)', id: 'currencyμBTC', fn: currency('μBTC') },
- { name: 'South African Rand (R)', id: 'currencyZAR', fn: currency('R') },
- { name: 'Indian Rupee (₹)', id: 'currencyINR', fn: currency('₹') },
- { name: 'South Korean Won (₩)', id: 'currencyKRW', fn: currency('₩') },
- { name: 'Indonesian Rupiah (Rp)', id: 'currencyIDR', fn: currency('Rp') },
- { name: 'Philippine Peso (PHP)', id: 'currencyPHP', fn: currency('PHP') },
- { name: 'Vietnamese Dong (VND)', id: 'currencyVND', fn: currency('đ', true) },
- { name: 'Turkish Lira (₺)', id: 'currencyTRY', fn: currency('₺', true) },
- { name: 'Malaysian Ringgit (RM)', id: 'currencyMYR', fn: currency('RM') },
- { name: 'CFP franc (XPF)', id: 'currencyXPF', fn: currency('XPF') },
- { name: 'Bulgarian Lev (BGN)', id: 'currencyBGN', fn: currency('BGN') },
- { name: 'Guaraní (₲)', id: 'currencyPYG', fn: currency('₲') },
- { name: 'Uruguay Peso (UYU)', id: 'currencyUYU', fn: currency('UYU') },
- { name: 'Israeli New Shekels (₪)', id: 'currencyILS', fn: currency('₪') },
- ],
- },
- {
- name: 'Data',
- formats: [
- { name: 'bytes(IEC)', id: 'bytes', fn: binaryPrefix('B') },
- { name: 'bytes(SI)', id: 'decbytes', fn: SIPrefix('B') },
- { name: 'bits(IEC)', id: 'bits', fn: binaryPrefix('b') },
- { name: 'bits(SI)', id: 'decbits', fn: SIPrefix('b') },
- { name: 'kibibytes', id: 'kbytes', fn: binaryPrefix('B', 1) },
- { name: 'kilobytes', id: 'deckbytes', fn: SIPrefix('B', 1) },
- { name: 'mebibytes', id: 'mbytes', fn: binaryPrefix('B', 2) },
- { name: 'megabytes', id: 'decmbytes', fn: SIPrefix('B', 2) },
- { name: 'gibibytes', id: 'gbytes', fn: binaryPrefix('B', 3) },
- { name: 'gigabytes', id: 'decgbytes', fn: SIPrefix('B', 3) },
- { name: 'tebibytes', id: 'tbytes', fn: binaryPrefix('B', 4) },
- { name: 'terabytes', id: 'dectbytes', fn: SIPrefix('B', 4) },
- { name: 'pebibytes', id: 'pbytes', fn: binaryPrefix('B', 5) },
- { name: 'petabytes', id: 'decpbytes', fn: SIPrefix('B', 5) },
- ],
- },
- {
- name: 'Data rate',
- formats: [
- { name: 'packets/sec', id: 'pps', fn: SIPrefix('p/s') },
- { name: 'bytes/sec(IEC)', id: 'binBps', fn: binaryPrefix('B/s') },
- { name: 'bytes/sec(SI)', id: 'Bps', fn: SIPrefix('B/s') },
- { name: 'bits/sec(IEC)', id: 'binbps', fn: binaryPrefix('b/s') },
- { name: 'bits/sec(SI)', id: 'bps', fn: SIPrefix('b/s') },
- { name: 'kibibytes/sec', id: 'KiBs', fn: binaryPrefix('B/s', 1) },
- { name: 'kibibits/sec', id: 'Kibits', fn: binaryPrefix('b/s', 1) },
- { name: 'kilobytes/sec', id: 'KBs', fn: SIPrefix('B/s', 1) },
- { name: 'kilobits/sec', id: 'Kbits', fn: SIPrefix('b/s', 1) },
- { name: 'mebibytes/sec', id: 'MiBs', fn: binaryPrefix('B/s', 2) },
- { name: 'mebibits/sec', id: 'Mibits', fn: binaryPrefix('b/s', 2) },
- { name: 'megabytes/sec', id: 'MBs', fn: SIPrefix('B/s', 2) },
- { name: 'megabits/sec', id: 'Mbits', fn: SIPrefix('b/s', 2) },
- { name: 'gibibytes/sec', id: 'GiBs', fn: binaryPrefix('B/s', 3) },
- { name: 'gibibits/sec', id: 'Gibits', fn: binaryPrefix('b/s', 3) },
- { name: 'gigabytes/sec', id: 'GBs', fn: SIPrefix('B/s', 3) },
- { name: 'gigabits/sec', id: 'Gbits', fn: SIPrefix('b/s', 3) },
- { name: 'tebibytes/sec', id: 'TiBs', fn: binaryPrefix('B/s', 4) },
- { name: 'tebibits/sec', id: 'Tibits', fn: binaryPrefix('b/s', 4) },
- { name: 'terabytes/sec', id: 'TBs', fn: SIPrefix('B/s', 4) },
- { name: 'terabits/sec', id: 'Tbits', fn: SIPrefix('b/s', 4) },
- { name: 'pebibytes/sec', id: 'PiBs', fn: binaryPrefix('B/s', 5) },
- { name: 'pebibits/sec', id: 'Pibits', fn: binaryPrefix('b/s', 5) },
- { name: 'petabytes/sec', id: 'PBs', fn: SIPrefix('B/s', 5) },
- { name: 'petabits/sec', id: 'Pbits', fn: SIPrefix('b/s', 5) },
- ],
- },
- {
- name: 'Date & time',
- formats: [
- { name: 'Datetime ISO', id: 'dateTimeAsIso', fn: dateTimeAsIso },
- { name: 'Datetime ISO (No date if today)', id: 'dateTimeAsIsoNoDateIfToday', fn: dateTimeAsIsoNoDateIfToday },
- { name: 'Datetime US', id: 'dateTimeAsUS', fn: dateTimeAsUS },
- { name: 'Datetime US (No date if today)', id: 'dateTimeAsUSNoDateIfToday', fn: dateTimeAsUSNoDateIfToday },
- { name: 'Datetime local', id: 'dateTimeAsLocal', fn: getDateTimeAsLocalFormat() },
{
- name: 'Datetime local (No date if today)',
+ name: t('grafana-data.valueFormats.categories.misc.formats.name-si-short', 'SI short'),
+ id: 'sishort',
+ fn: SIPrefix(''),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.misc.formats.name-percent-100', 'Percent (0-100)'),
+ id: 'percent',
+ fn: toPercent,
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.misc.formats.name-percent-1', 'Percent (0.0-1.0)'),
+ id: 'percentunit',
+ fn: toPercentUnit,
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.misc.formats.name-humidity', 'Humidity (%H)'),
+ id: 'humidity',
+ fn: toFixedUnit('%H'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.misc.formats.name-decibel', 'Decibel'),
+ id: 'dB',
+ fn: toFixedUnit('dB'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.misc.formats.name-candala', 'Candela (cd)'),
+ id: 'candela',
+ fn: SIPrefix('cd'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.misc.formats.name-hexadecimal-0x', 'Hexadecimal (0x)'),
+ id: 'hex0x',
+ fn: toHex0x,
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.misc.formats.name-hexadecimal', 'Hexadecimal'),
+ id: 'hex',
+ fn: toHex,
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.misc.formats.name-scientific', 'Scientific notation'),
+ id: 'sci',
+ fn: sci,
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.misc.formats.name-locale', 'Locale format'),
+ id: 'locale',
+ fn: locale,
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.misc.formats.name-pixels', 'Pixels'),
+ id: 'pixel',
+ fn: toFixedUnit('px'),
+ },
+ ],
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.acceleration.name', 'Acceleration'),
+ formats: [
+ {
+ name: t('grafana-data.valueFormats.categories.acceleration.formats.name-meters-sec', 'Meters/sec²'),
+ id: 'accMS2',
+ fn: toFixedUnit('m/sec²'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.acceleration.formats.name-feet-sec', 'Feet/sec²'),
+ id: 'accFS2',
+ fn: toFixedUnit('f/sec²'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.acceleration.formats.name-g-unit', 'G unit'),
+ id: 'accG',
+ fn: toFixedUnit('g'),
+ },
+ ],
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.angle.name', 'Angle'),
+ formats: [
+ {
+ name: t('grafana-data.valueFormats.categories.angle.formats.name-degrees', 'Degrees (°)'),
+ id: 'degree',
+ fn: toFixedUnit('°'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.angle.formats.name-radians', 'Radians'),
+ id: 'radian',
+ fn: toFixedUnit('rad'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.angle.formats.name-gradian', 'Gradian'),
+ id: 'grad',
+ fn: toFixedUnit('grad'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.angle.formats.name-arc-minutes', 'Arc Minutes'),
+ id: 'arcmin',
+ fn: toFixedUnit('arcmin'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.angle.formats.name-arc-seconds', 'Arc Seconds'),
+ id: 'arcsec',
+ fn: toFixedUnit('arcsec'),
+ },
+ ],
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.area.name', 'Area'),
+ formats: [
+ {
+ name: t('grafana-data.valueFormats.categories.area.formats.name-square-meters', 'Square Meters (m²)'),
+ id: 'areaM2',
+ fn: toFixedUnit('m²'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.area.formats.name-square-feet', 'Square Feet (ft²)'),
+ id: 'areaF2',
+ fn: toFixedUnit('ft²'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.area.formats.name-square-miles', 'Square Miles (mi²)'),
+ id: 'areaMI2',
+ fn: toFixedUnit('mi²'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.area.formats.name-acres', 'Acres (ac)'),
+ id: 'acres',
+ fn: toFixedUnit('ac'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.area.formats.name-hectares', 'Hectares (ha)'),
+ id: 'hectares',
+ fn: toFixedUnit('ha'),
+ },
+ ],
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.computation.name', 'Computation'),
+ formats: [
+ {
+ name: t('grafana-data.valueFormats.categories.computation.formats.name-flops', 'FLOP/s'),
+ id: 'flops',
+ fn: SIPrefix('FLOPS'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.computation.formats.name-mflops', 'MFLOP/s'),
+ id: 'mflops',
+ fn: SIPrefix('FLOPS', 2),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.computation.formats.name-gflops', 'GFLOP/s'),
+ id: 'gflops',
+ fn: SIPrefix('FLOPS', 3),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.computation.formats.name-tflops', 'TFLOP/s'),
+ id: 'tflops',
+ fn: SIPrefix('FLOPS', 4),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.computation.formats.name-pflops', 'PFLOP/s'),
+ id: 'pflops',
+ fn: SIPrefix('FLOPS', 5),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.computation.formats.name-eflops', 'EFLOP/s'),
+ id: 'eflops',
+ fn: SIPrefix('FLOPS', 6),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.computation.formats.name-zflops', 'ZFLOP/s'),
+ id: 'zflops',
+ fn: SIPrefix('FLOPS', 7),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.computation.formats.name-yflops', 'YFLOP/s'),
+ id: 'yflops',
+ fn: SIPrefix('FLOPS', 8),
+ },
+ ],
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.concentration.name', 'Concentration'),
+ formats: [
+ {
+ name: t('grafana-data.valueFormats.categories.concentration.formats.name-ppm', 'parts-per-million (ppm)'),
+ id: 'ppm',
+ fn: toFixedUnit('ppm'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.concentration.formats.name-ppb', 'parts-per-billion (ppb)'),
+ id: 'conppb',
+ fn: toFixedUnit('ppb'),
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.concentration.formats.name-ng-m3',
+ 'nanogram per cubic meter (ng/m³)'
+ ),
+ id: 'conngm3',
+ fn: toFixedUnit('ng/m³'),
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.concentration.formats.name-ng-nm3',
+ 'nanogram per normal cubic meter (ng/Nm³)'
+ ),
+ id: 'conngNm3',
+ fn: toFixedUnit('ng/Nm³'),
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.concentration.formats.name-ug-m3',
+ 'microgram per cubic meter (μg/m³)'
+ ),
+ id: 'conμgm3',
+ fn: toFixedUnit('μg/m³'),
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.concentration.formats.name-ug-nm3',
+ 'microgram per normal cubic meter (μg/Nm³)'
+ ),
+ id: 'conμgNm3',
+ fn: toFixedUnit('μg/Nm³'),
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.concentration.formats.name-mg-m3',
+ 'milligram per cubic meter (mg/m³)'
+ ),
+ id: 'conmgm3',
+ fn: toFixedUnit('mg/m³'),
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.concentration.formats.name-mg-nm3',
+ 'milligram per normal cubic meter (mg/Nm³)'
+ ),
+ id: 'conmgNm3',
+ fn: toFixedUnit('mg/Nm³'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.concentration.formats.name-g-m3', 'gram per cubic meter (g/m³)'),
+ id: 'congm3',
+ fn: toFixedUnit('g/m³'),
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.concentration.formats.name-g-nm3',
+ 'gram per normal cubic meter (g/Nm³)'
+ ),
+ id: 'congNm3',
+ fn: toFixedUnit('g/Nm³'),
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.concentration.formats.name-mg-dl',
+ 'milligrams per decilitre (mg/dL)'
+ ),
+ id: 'conmgdL',
+ fn: toFixedUnit('mg/dL'),
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.concentration.formats.name-mmol-l',
+ 'millimoles per litre (mmol/L)'
+ ),
+ id: 'conmmolL',
+ fn: toFixedUnit('mmol/L'),
+ },
+ ],
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.name', 'Currency'),
+ formats: [
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-usd', 'Dollars ($)'),
+ id: 'currencyUSD',
+ fn: currency('$'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-gbp', 'Pounds (£)'),
+ id: 'currencyGBP',
+ fn: currency('£'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-eur', 'Euro (€)'),
+ id: 'currencyEUR',
+ fn: currency('€'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-jpy', 'Yen (¥)'),
+ id: 'currencyJPY',
+ fn: currency('¥'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-rub', 'Rubles (₽)'),
+ id: 'currencyRUB',
+ fn: currency('₽'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-uah', 'Hryvnias (₴)'),
+ id: 'currencyUAH',
+ fn: currency('₴'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-brl', 'Real (R$)'),
+ id: 'currencyBRL',
+ fn: currency('R$'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-dkk', 'Danish Krone (kr)'),
+ id: 'currencyDKK',
+ fn: currency('kr', true),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-isk', 'Icelandic Króna (kr)'),
+ id: 'currencyISK',
+ fn: currency('kr', true),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-nok', 'Norwegian Krone (kr)'),
+ id: 'currencyNOK',
+ fn: currency('kr', true),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-sek', 'Swedish Krona (kr)'),
+ id: 'currencySEK',
+ fn: currency('kr', true),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-czk', 'Czech koruna (czk)'),
+ id: 'currencyCZK',
+ fn: currency('czk'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-chf', 'Swiss franc (CHF)'),
+ id: 'currencyCHF',
+ fn: currency('CHF'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-pln', 'Polish Złoty (PLN)'),
+ id: 'currencyPLN',
+ fn: currency('PLN'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-btc', 'Bitcoin (฿)'),
+ id: 'currencyBTC',
+ fn: currency('฿'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-mbtc', 'Milli Bitcoin (฿)'),
+ id: 'currencymBTC',
+ fn: currency('mBTC'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-ubtc', 'Micro Bitcoin (฿)'),
+ id: 'currencyμBTC',
+ fn: currency('μBTC'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-zar', 'South African Rand (R)'),
+ id: 'currencyZAR',
+ fn: currency('R'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-inr', 'Indian Rupee (₹)'),
+ id: 'currencyINR',
+ fn: currency('₹'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-krw', 'South Korean Won (₩)'),
+ id: 'currencyKRW',
+ fn: currency('₩'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-idr', 'Indonesian Rupiah (Rp)'),
+ id: 'currencyIDR',
+ fn: currency('Rp'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-php', 'Philippine Peso (PHP)'),
+ id: 'currencyPHP',
+ fn: currency('PHP'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-vnd', 'Vietnamese Dong (VND)'),
+ id: 'currencyVND',
+ fn: currency('đ', true),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-try', 'Turkish Lira (₺)'),
+ id: 'currencyTRY',
+ fn: currency('₺', true),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-myr', 'Malaysian Ringgit (RM)'),
+ id: 'currencyMYR',
+ fn: currency('RM'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-xpf', 'CFP franc (XPF)'),
+ id: 'currencyXPF',
+ fn: currency('XPF'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-bgn', 'Bulgarian Lev (BGN)'),
+ id: 'currencyBGN',
+ fn: currency('BGN'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-pyg', 'Guaraní (₲)'),
+ id: 'currencyPYG',
+ fn: currency('₲'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-uyu', 'Uruguay Peso (UYU)'),
+ id: 'currencyUYU',
+ fn: currency('UYU'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.currency.formats.name-ils', 'Israeli New Shekels (₪)'),
+ id: 'currencyILS',
+ fn: currency('₪'),
+ },
+ ],
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data.name', 'Data'),
+ formats: [
+ {
+ name: t('grafana-data.valueFormats.categories.data.formats.name-bytes-iec', 'bytes(IEC)'),
+ id: 'bytes',
+ fn: binaryPrefix('B'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data.formats.name-bytes-si', 'bytes(SI)'),
+ id: 'decbytes',
+ fn: SIPrefix('B'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data.formats.name-bits-iec', 'bits(IEC)'),
+ id: 'bits',
+ fn: binaryPrefix('b'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data.formats.name-bits-si', 'bits(SI)'),
+ id: 'decbits',
+ fn: SIPrefix('b'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data.formats.name-kibibytes', 'kibibytes'),
+ id: 'kbytes',
+ fn: binaryPrefix('B', 1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data.formats.name-kilobytes', 'kilobytes'),
+ id: 'deckbytes',
+ fn: SIPrefix('B', 1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data.formats.name-mebibytes', 'mebibytes'),
+ id: 'mbytes',
+ fn: binaryPrefix('B', 2),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data.formats.name-megabytes', 'megabytes'),
+ id: 'decmbytes',
+ fn: SIPrefix('B', 2),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data.formats.name-gibibytes', 'gibibytes'),
+ id: 'gbytes',
+ fn: binaryPrefix('B', 3),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data.formats.name-gigabytes', 'gigabytes'),
+ id: 'decgbytes',
+ fn: SIPrefix('B', 3),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data.formats.name-tebibytes', 'tebibytes'),
+ id: 'tbytes',
+ fn: binaryPrefix('B', 4),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data.formats.name-terabytes', 'terabytes'),
+ id: 'dectbytes',
+ fn: SIPrefix('B', 4),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data.formats.name-pebibytes', 'pebibytes'),
+ id: 'pbytes',
+ fn: binaryPrefix('B', 5),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data.formats.name-petabytes', 'petabytes'),
+ id: 'decpbytes',
+ fn: SIPrefix('B', 5),
+ },
+ ],
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.name', 'Data rate'),
+ formats: [
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-packets-sec', 'packets/sec'),
+ id: 'pps',
+ fn: SIPrefix('p/s'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-bytes-sec-iec', 'bytes/sec(IEC)'),
+ id: 'binBps',
+ fn: binaryPrefix('B/s'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-bytes-sec-si', 'bytes/sec(SI)'),
+ id: 'Bps',
+ fn: SIPrefix('B/s'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-bits-sec-iec', 'bits/sec(IEC)'),
+ id: 'binbps',
+ fn: binaryPrefix('b/s'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-bits-sec-si', 'bits/sec(SI)'),
+ id: 'bps',
+ fn: SIPrefix('b/s'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-kibibytes-sec', 'kibibytes/sec'),
+ id: 'KiBs',
+ fn: binaryPrefix('B/s', 1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-kibibits-sec', 'kibibits/sec'),
+ id: 'Kibits',
+ fn: binaryPrefix('b/s', 1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-kilobytes-sec', 'kilobytes/sec'),
+ id: 'KBs',
+ fn: SIPrefix('B/s', 1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-kilobits-sec', 'kilobits/sec'),
+ id: 'Kbits',
+ fn: SIPrefix('b/s', 1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-mebibytes-sec', 'mebibytes/sec'),
+ id: 'MiBs',
+ fn: binaryPrefix('B/s', 2),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-mebibits-sec', 'mebibits/sec'),
+ id: 'Mibits',
+ fn: binaryPrefix('b/s', 2),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-megabytes-sec', 'megabytes/sec'),
+ id: 'MBs',
+ fn: SIPrefix('B/s', 2),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-megabits-sec', 'megabits/sec'),
+ id: 'Mbits',
+ fn: SIPrefix('b/s', 2),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-gibibytes-sec', 'gibibytes/sec'),
+ id: 'GiBs',
+ fn: binaryPrefix('B/s', 3),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-gibibits-sec', 'gibibits/sec'),
+ id: 'Gibits',
+ fn: binaryPrefix('b/s', 3),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-gigabytes-sec', 'gigabytes/sec'),
+ id: 'GBs',
+ fn: SIPrefix('B/s', 3),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-gigabits-sec', 'gigabits/sec'),
+ id: 'Gbits',
+ fn: SIPrefix('b/s', 3),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-tebibytes-sec', 'tebibytes/sec'),
+ id: 'TiBs',
+ fn: binaryPrefix('B/s', 4),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-tebibits-sec', 'tebibits/sec'),
+ id: 'Tibits',
+ fn: binaryPrefix('b/s', 4),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-terabytes-sec', 'terabytes/sec'),
+ id: 'TBs',
+ fn: SIPrefix('B/s', 4),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-terabits-sec', 'terabits/sec'),
+ id: 'Tbits',
+ fn: SIPrefix('b/s', 4),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-pebibytes-sec', 'pebibytes/sec'),
+ id: 'PiBs',
+ fn: binaryPrefix('B/s', 5),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-pebibits-sec', 'pebibits/sec'),
+ id: 'Pibits',
+ fn: binaryPrefix('b/s', 5),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-petabytes-sec', 'petabytes/sec'),
+ id: 'PBs',
+ fn: SIPrefix('B/s', 5),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.data-rate.formats.name-petabits-sec', 'petabits/sec'),
+ id: 'Pbits',
+ fn: SIPrefix('b/s', 5),
+ },
+ ],
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.date-time.name', 'Date & time'),
+ formats: [
+ {
+ name: t('grafana-data.valueFormats.categories.date-time.formats.name-datetime-iso', 'Datetime ISO'),
+ id: 'dateTimeAsIso',
+ fn: dateTimeAsIso,
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.date-time.formats.name-datetime-iso-no-date',
+ 'Datetime ISO (No date if today)'
+ ),
+ id: 'dateTimeAsIsoNoDateIfToday',
+ fn: dateTimeAsIsoNoDateIfToday,
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.date-time.formats.name-datetime-us', 'Datetime US'),
+ id: 'dateTimeAsUS',
+ fn: dateTimeAsUS,
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.date-time.formats.name-datetime-us-no-date',
+ 'Datetime US (No date if today)'
+ ),
+ id: 'dateTimeAsUSNoDateIfToday',
+ fn: dateTimeAsUSNoDateIfToday,
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.date-time.formats.name-datetime-local', 'Datetime local'),
+ id: 'dateTimeAsLocal',
+ fn: getDateTimeAsLocalFormat(),
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.date-time.formats.name-datetime-local-no-date',
+ 'Datetime local (No date if today)'
+ ),
id: 'dateTimeAsLocalNoDateIfToday',
fn: getDateTimeAsLocalFormatNoDateIfToday(),
},
- { name: 'Datetime default', id: 'dateTimeAsSystem', fn: dateTimeSystemFormatter },
- { name: 'From Now', id: 'dateTimeFromNow', fn: dateTimeFromNow },
+ {
+ name: t('grafana-data.valueFormats.categories.date-time.formats.name-datetime-default', 'Datetime default'),
+ id: 'dateTimeAsSystem',
+ fn: dateTimeSystemFormatter,
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.date-time.formats.name-from-now', 'From Now'),
+ id: 'dateTimeFromNow',
+ fn: dateTimeFromNow,
+ },
],
},
{
- name: 'Energy',
+ name: t('grafana-data.valueFormats.categories.energy.name', 'Energy'),
formats: [
- { name: 'Watt (W)', id: 'watt', fn: SIPrefix('W') },
- { name: 'Kilowatt (kW)', id: 'kwatt', fn: SIPrefix('W', 1) },
- { name: 'Megawatt (MW)', id: 'megwatt', fn: SIPrefix('W', 2) },
- { name: 'Gigawatt (GW)', id: 'gwatt', fn: SIPrefix('W', 3) },
- { name: 'Milliwatt (mW)', id: 'mwatt', fn: SIPrefix('W', -1) },
- { name: 'Watt per square meter (W/m²)', id: 'Wm2', fn: SIPrefix('W/m²') },
- { name: 'Volt-Ampere (VA)', id: 'voltamp', fn: SIPrefix('VA') },
- { name: 'Kilovolt-Ampere (kVA)', id: 'kvoltamp', fn: SIPrefix('VA', 1) },
- { name: 'Volt-Ampere reactive (VAr)', id: 'voltampreact', fn: SIPrefix('VAr') },
- { name: 'Kilovolt-Ampere reactive (kVAr)', id: 'kvoltampreact', fn: SIPrefix('VAr', 1) },
- { name: 'Watt-hour (Wh)', id: 'watth', fn: SIPrefix('Wh') },
- { name: 'Watt-hour per Kilogram (Wh/kg)', id: 'watthperkg', fn: SIPrefix('Wh/kg') },
- { name: 'Kilowatt-hour (kWh)', id: 'kwatth', fn: SIPrefix('Wh', 1) },
- { name: 'Kilowatt-min (kWm)', id: 'kwattm', fn: SIPrefix('W-Min', 1) },
- { name: 'Megawatt-hour (MWh)', id: 'mwatth', fn: SIPrefix('Wh', 2) },
- { name: 'Ampere-hour (Ah)', id: 'amph', fn: SIPrefix('Ah') },
- { name: 'Kiloampere-hour (kAh)', id: 'kamph', fn: SIPrefix('Ah', 1) },
- { name: 'Milliampere-hour (mAh)', id: 'mamph', fn: SIPrefix('Ah', -1) },
- { name: 'Joule (J)', id: 'joule', fn: SIPrefix('J') },
- { name: 'Electron volt (eV)', id: 'ev', fn: SIPrefix('eV') },
- { name: 'Ampere (A)', id: 'amp', fn: SIPrefix('A') },
- { name: 'Kiloampere (kA)', id: 'kamp', fn: SIPrefix('A', 1) },
- { name: 'Milliampere (mA)', id: 'mamp', fn: SIPrefix('A', -1) },
- { name: 'Volt (V)', id: 'volt', fn: SIPrefix('V') },
- { name: 'Kilovolt (kV)', id: 'kvolt', fn: SIPrefix('V', 1) },
- { name: 'Millivolt (mV)', id: 'mvolt', fn: SIPrefix('V', -1) },
- { name: 'Decibel-milliwatt (dBm)', id: 'dBm', fn: SIPrefix('dBm') },
- { name: 'Milliohm (mΩ)', id: 'mohm', fn: SIPrefix('Ω', -1) },
- { name: 'Ohm (Ω)', id: 'ohm', fn: SIPrefix('Ω') },
- { name: 'Kiloohm (kΩ)', id: 'kohm', fn: SIPrefix('Ω', 1) },
- { name: 'Megaohm (MΩ)', id: 'Mohm', fn: SIPrefix('Ω', 2) },
- { name: 'Farad (F)', id: 'farad', fn: SIPrefix('F') },
- { name: 'Microfarad (µF)', id: 'µfarad', fn: SIPrefix('F', -2) },
- { name: 'Nanofarad (nF)', id: 'nfarad', fn: SIPrefix('F', -3) },
- { name: 'Picofarad (pF)', id: 'pfarad', fn: SIPrefix('F', -4) },
- { name: 'Femtofarad (fF)', id: 'ffarad', fn: SIPrefix('F', -5) },
- { name: 'Henry (H)', id: 'henry', fn: SIPrefix('H') },
- { name: 'Millihenry (mH)', id: 'mhenry', fn: SIPrefix('H', -1) },
- { name: 'Microhenry (µH)', id: 'µhenry', fn: SIPrefix('H', -2) },
- { name: 'Lumens (Lm)', id: 'lumens', fn: SIPrefix('Lm') },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-watt', 'Watt (W)'),
+ id: 'watt',
+ fn: SIPrefix('W'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-kilowatt', 'Kilowatt (kW)'),
+ id: 'kwatt',
+ fn: SIPrefix('W', 1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-megawatt', 'Megawatt (MW)'),
+ id: 'megwatt',
+ fn: SIPrefix('W', 2),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-gigawatt', 'Gigawatt (GW)'),
+ id: 'gwatt',
+ fn: SIPrefix('W', 3),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-milliwatt', 'Milliwatt (mW)'),
+ id: 'mwatt',
+ fn: SIPrefix('W', -1),
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.energy.formats.name-watt-square-meter',
+ 'Watt per square meter (W/m²)'
+ ),
+ id: 'Wm2',
+ fn: SIPrefix('W/m²'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-volt-ampere', 'Volt-Ampere (VA)'),
+ id: 'voltamp',
+ fn: SIPrefix('VA'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-kilovolt-ampere', 'Kilovolt-Ampere (kVA)'),
+ id: 'kvoltamp',
+ fn: SIPrefix('VA', 1),
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.energy.formats.name-volt-ampere-reactive',
+ 'Volt-Ampere reactive (VAr)'
+ ),
+ id: 'voltampreact',
+ fn: SIPrefix('VAr'),
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.energy.formats.name-kilovolt-ampere-reactive',
+ 'Kilovolt-Ampere reactive (kVAr)'
+ ),
+ id: 'kvoltampreact',
+ fn: SIPrefix('VAr', 1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-watt-hour', 'Watt-hour (Wh)'),
+ id: 'watth',
+ fn: SIPrefix('Wh'),
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.energy.formats.name-watt-hour-per-kg',
+ 'Watt-hour per Kilogram (Wh/kg)'
+ ),
+ id: 'watthperkg',
+ fn: SIPrefix('Wh/kg'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-kilowatt-hour', 'Kilowatt-hour (kWh)'),
+ id: 'kwatth',
+ fn: SIPrefix('Wh', 1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-kilowatt-min', 'Kilowatt-min (kWm)'),
+ id: 'kwattm',
+ fn: SIPrefix('W-Min', 1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-megawatt-hour', 'Megawatt-hour (MWh)'),
+ id: 'mwatth',
+ fn: SIPrefix('Wh', 2),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-ampere-hour', 'Ampere-hour (Ah)'),
+ id: 'amph',
+ fn: SIPrefix('Ah'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-kiloampere-hour', 'Kiloampere-hour (kAh)'),
+ id: 'kamph',
+ fn: SIPrefix('Ah', 1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-milliampere-hour', 'Milliampere-hour (mAh)'),
+ id: 'mamph',
+ fn: SIPrefix('Ah', -1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-joule', 'Joule (J)'),
+ id: 'joule',
+ fn: SIPrefix('J'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-electron-volt', 'Electron volt (eV)'),
+ id: 'ev',
+ fn: SIPrefix('eV'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-ampere', 'Ampere (A)'),
+ id: 'amp',
+ fn: SIPrefix('A'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-kiloampere', 'Kiloampere (kA)'),
+ id: 'kamp',
+ fn: SIPrefix('A', 1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-milliampere', 'Milliampere (mA)'),
+ id: 'mamp',
+ fn: SIPrefix('A', -1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-volt', 'Volt (V)'),
+ id: 'volt',
+ fn: SIPrefix('V'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-kilovolt', 'Kilovolt (kV)'),
+ id: 'kvolt',
+ fn: SIPrefix('V', 1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-millivolt', 'Millivolt (mV)'),
+ id: 'mvolt',
+ fn: SIPrefix('V', -1),
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.energy.formats.name-decibel-milliwatt',
+ 'Decibel-milliwatt (dBm)'
+ ),
+ id: 'dBm',
+ fn: SIPrefix('dBm'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-milliohm', 'Milliohm (mΩ)'),
+ id: 'mohm',
+ fn: SIPrefix('Ω', -1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-ohm', 'Ohm (Ω)'),
+ id: 'ohm',
+ fn: SIPrefix('Ω'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-kiloohm', 'Kiloohm (kΩ)'),
+ id: 'kohm',
+ fn: SIPrefix('Ω', 1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-megaohm', 'Megaohm (MΩ)'),
+ id: 'Mohm',
+ fn: SIPrefix('Ω', 2),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-farad', 'Farad (F)'),
+ id: 'farad',
+ fn: SIPrefix('F'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-microfarad', 'Microfarad (µF)'),
+ id: 'µfarad',
+ fn: SIPrefix('F', -2),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-nanofarad', 'Nanofarad (nF)'),
+ id: 'nfarad',
+ fn: SIPrefix('F', -3),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-picofarad', 'Picofarad (pF)'),
+ id: 'pfarad',
+ fn: SIPrefix('F', -4),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-femtofarad', 'Femtofarad (fF)'),
+ id: 'ffarad',
+ fn: SIPrefix('F', -5),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-henry', 'Henry (H)'),
+ id: 'henry',
+ fn: SIPrefix('H'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-millihenry', 'Millihenry (mH)'),
+ id: 'mhenry',
+ fn: SIPrefix('H', -1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-microhenry', 'Microhenry (µH)'),
+ id: 'µhenry',
+ fn: SIPrefix('H', -2),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.energy.formats.name-lumens', 'Lumens (Lm)'),
+ id: 'lumens',
+ fn: SIPrefix('Lm'),
+ },
],
},
{
- name: 'Flow',
+ name: t('grafana-data.valueFormats.categories.flow.name', 'Flow'),
formats: [
- { name: 'Gallons/min (gpm)', id: 'flowgpm', fn: toFixedUnit('gpm') },
- { name: 'Cubic meters/sec (cms)', id: 'flowcms', fn: toFixedUnit('cms') },
- { name: 'Cubic feet/sec (cfs)', id: 'flowcfs', fn: toFixedUnit('cfs') },
- { name: 'Cubic feet/min (cfm)', id: 'flowcfm', fn: toFixedUnit('cfm') },
- { name: 'Litre/hour', id: 'litreh', fn: toFixedUnit('L/h') },
- { name: 'Litre/min (L/min)', id: 'flowlpm', fn: toFixedUnit('L/min') },
- { name: 'milliLitre/min (mL/min)', id: 'flowmlpm', fn: toFixedUnit('mL/min') },
- { name: 'Lux (lx)', id: 'lux', fn: toFixedUnit('lux') },
+ {
+ name: t('grafana-data.valueFormats.categories.flow.formats.name-gallons-min', 'Gallons/min (gpm)'),
+ id: 'flowgpm',
+ fn: toFixedUnit('gpm'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.flow.formats.name-cubic-meters-sec', 'Cubic meters/sec (cms)'),
+ id: 'flowcms',
+ fn: toFixedUnit('cms'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.flow.formats.name-cubic-feet-sec', 'Cubic feet/sec (cfs)'),
+ id: 'flowcfs',
+ fn: toFixedUnit('cfs'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.flow.formats.name-cubic-feet-min', 'Cubic feet/min (cfm)'),
+ id: 'flowcfm',
+ fn: toFixedUnit('cfm'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.flow.formats.name-litre-hour', 'Litre/hour'),
+ id: 'litreh',
+ fn: toFixedUnit('L/h'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.flow.formats.name-litre-min', 'Litre/min (L/min)'),
+ id: 'flowlpm',
+ fn: toFixedUnit('L/min'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.flow.formats.name-millilitre-min', 'milliLitre/min (mL/min)'),
+ id: 'flowmlpm',
+ fn: toFixedUnit('mL/min'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.flow.formats.name-lux', 'Lux (lx)'),
+ id: 'lux',
+ fn: toFixedUnit('lux'),
+ },
],
},
{
- name: 'Force',
+ name: t('grafana-data.valueFormats.categories.force.name', 'Force'),
formats: [
- { name: 'Newton-meters (Nm)', id: 'forceNm', fn: SIPrefix('Nm') },
- { name: 'Kilonewton-meters (kNm)', id: 'forcekNm', fn: SIPrefix('Nm', 1) },
- { name: 'Newtons (N)', id: 'forceN', fn: SIPrefix('N') },
- { name: 'Kilonewtons (kN)', id: 'forcekN', fn: SIPrefix('N', 1) },
+ {
+ name: t('grafana-data.valueFormats.categories.force.formats.name-newton-meters', 'Newton-meters (Nm)'),
+ id: 'forceNm',
+ fn: SIPrefix('Nm'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.force.formats.name-kilonewton-meters', 'Kilonewton-meters (kNm)'),
+ id: 'forcekNm',
+ fn: SIPrefix('Nm', 1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.force.formats.name-newtons', 'Newtons (N)'),
+ id: 'forceN',
+ fn: SIPrefix('N'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.force.formats.name-kilonewtons', 'Kilonewtons (kN)'),
+ id: 'forcekN',
+ fn: SIPrefix('N', 1),
+ },
],
},
{
- name: 'Hash rate',
+ name: t('grafana-data.valueFormats.categories.hash-rate.name', 'Hash rate'),
formats: [
- { name: 'hashes/sec', id: 'Hs', fn: SIPrefix('H/s') },
- { name: 'kilohashes/sec', id: 'KHs', fn: SIPrefix('H/s', 1) },
- { name: 'megahashes/sec', id: 'MHs', fn: SIPrefix('H/s', 2) },
- { name: 'gigahashes/sec', id: 'GHs', fn: SIPrefix('H/s', 3) },
- { name: 'terahashes/sec', id: 'THs', fn: SIPrefix('H/s', 4) },
- { name: 'petahashes/sec', id: 'PHs', fn: SIPrefix('H/s', 5) },
- { name: 'exahashes/sec', id: 'EHs', fn: SIPrefix('H/s', 6) },
+ {
+ name: t('grafana-data.valueFormats.categories.hash-rate.formats.name-hashes-sec', 'hashes/sec'),
+ id: 'Hs',
+ fn: SIPrefix('H/s'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.hash-rate.formats.name-kilohashes-sec', 'kilohashes/sec'),
+ id: 'KHs',
+ fn: SIPrefix('H/s', 1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.hash-rate.formats.name-megahashes-sec', 'megahashes/sec'),
+ id: 'MHs',
+ fn: SIPrefix('H/s', 2),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.hash-rate.formats.name-gigahashes-sec', 'gigahashes/sec'),
+ id: 'GHs',
+ fn: SIPrefix('H/s', 3),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.hash-rate.formats.name-terahashes-sec', 'terahashes/sec'),
+ id: 'THs',
+ fn: SIPrefix('H/s', 4),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.hash-rate.formats.name-petahashes-sec', 'petahashes/sec'),
+ id: 'PHs',
+ fn: SIPrefix('H/s', 5),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.hash-rate.formats.name-exahashes-sec', 'exahashes/sec'),
+ id: 'EHs',
+ fn: SIPrefix('H/s', 6),
+ },
],
},
{
- name: 'Mass',
+ name: t('grafana-data.valueFormats.categories.mass.name', 'Mass'),
formats: [
- { name: 'milligram (mg)', id: 'massmg', fn: SIPrefix('g', -1) },
- { name: 'gram (g)', id: 'massg', fn: SIPrefix('g') },
- { name: 'pound (lb)', id: 'masslb', fn: toFixedUnit('lb') },
- { name: 'kilogram (kg)', id: 'masskg', fn: SIPrefix('g', 1) },
- { name: 'metric ton (t)', id: 'masst', fn: toFixedUnit('t') },
+ {
+ name: t('grafana-data.valueFormats.categories.mass.formats.name-milligram', 'milligram (mg)'),
+ id: 'massmg',
+ fn: SIPrefix('g', -1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.mass.formats.name-gram', 'gram (g)'),
+ id: 'massg',
+ fn: SIPrefix('g'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.mass.formats.name-pound', 'pound (lb)'),
+ id: 'masslb',
+ fn: toFixedUnit('lb'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.mass.formats.name-kilogram', 'kilogram (kg)'),
+ id: 'masskg',
+ fn: SIPrefix('g', 1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.mass.formats.name-metric-ton', 'metric ton (t)'),
+ id: 'masst',
+ fn: toFixedUnit('t'),
+ },
],
},
{
- name: 'Length',
+ name: t('grafana-data.valueFormats.categories.length.name', 'Length'),
formats: [
- { name: 'millimeter (mm)', id: 'lengthmm', fn: SIPrefix('m', -1) },
- { name: 'inch (in)', id: 'lengthin', fn: toFixedUnit('in') },
- { name: 'feet (ft)', id: 'lengthft', fn: toFixedUnit('ft') },
- { name: 'meter (m)', id: 'lengthm', fn: SIPrefix('m') },
- { name: 'kilometer (km)', id: 'lengthkm', fn: SIPrefix('m', 1) },
- { name: 'mile (mi)', id: 'lengthmi', fn: toFixedUnit('mi') },
+ {
+ name: t('grafana-data.valueFormats.categories.length.formats.name-millimeter', 'millimeter (mm)'),
+ id: 'lengthmm',
+ fn: SIPrefix('m', -1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.length.formats.name-inch', 'inch (in)'),
+ id: 'lengthin',
+ fn: toFixedUnit('in'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.length.formats.name-feet', 'feet (ft)'),
+ id: 'lengthft',
+ fn: toFixedUnit('ft'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.length.formats.name-meter', 'meter (m)'),
+ id: 'lengthm',
+ fn: SIPrefix('m'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.length.formats.name-kilometer', 'kilometer (km)'),
+ id: 'lengthkm',
+ fn: SIPrefix('m', 1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.length.formats.name-mile', 'mile (mi)'),
+ id: 'lengthmi',
+ fn: toFixedUnit('mi'),
+ },
],
},
{
- name: 'Pressure',
+ name: t('grafana-data.valueFormats.categories.pressure.name', 'Pressure'),
formats: [
- { name: 'Millibars', id: 'pressurembar', fn: SIPrefix('bar', -1) },
- { name: 'Bars', id: 'pressurebar', fn: SIPrefix('bar') },
- { name: 'Kilobars', id: 'pressurekbar', fn: SIPrefix('bar', 1) },
- { name: 'Pascals', id: 'pressurepa', fn: SIPrefix('Pa') },
- { name: 'Hectopascals', id: 'pressurehpa', fn: toFixedUnit('hPa') },
- { name: 'Kilopascals', id: 'pressurekpa', fn: toFixedUnit('kPa') },
- { name: 'Inches of mercury', id: 'pressurehg', fn: toFixedUnit('"Hg') },
- { name: 'PSI', id: 'pressurepsi', fn: scaledUnits(1000, ['psi', 'ksi', 'Mpsi']) },
+ {
+ name: t('grafana-data.valueFormats.categories.pressure.formats.name-millibars', 'Millibars'),
+ id: 'pressurembar',
+ fn: SIPrefix('bar', -1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.pressure.formats.name-bars', 'Bars'),
+ id: 'pressurebar',
+ fn: SIPrefix('bar'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.pressure.formats.name-kilobars', 'Kilobars'),
+ id: 'pressurekbar',
+ fn: SIPrefix('bar', 1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.pressure.formats.name-pascals', 'Pascals'),
+ id: 'pressurepa',
+ fn: SIPrefix('Pa'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.pressure.formats.name-hectopascals', 'Hectopascals'),
+ id: 'pressurehpa',
+ fn: toFixedUnit('hPa'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.pressure.formats.name-kilopascals', 'Kilopascals'),
+ id: 'pressurekpa',
+ fn: toFixedUnit('kPa'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.pressure.formats.name-inches-mercury', 'Inches of mercury'),
+ id: 'pressurehg',
+ fn: toFixedUnit('"Hg'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.pressure.formats.name-psi', 'PSI'),
+ id: 'pressurepsi',
+ fn: scaledUnits(1000, ['psi', 'ksi', 'Mpsi']),
+ },
],
},
{
- name: 'Radiation',
+ name: t('grafana-data.valueFormats.categories.radiation.name', 'Radiation'),
formats: [
- { name: 'Becquerel (Bq)', id: 'radbq', fn: SIPrefix('Bq') },
- { name: 'curie (Ci)', id: 'radci', fn: SIPrefix('Ci') },
- { name: 'Gray (Gy)', id: 'radgy', fn: SIPrefix('Gy') },
- { name: 'rad', id: 'radrad', fn: SIPrefix('rad') },
- { name: 'Sievert (Sv)', id: 'radsv', fn: SIPrefix('Sv') },
- { name: 'milliSievert (mSv)', id: 'radmsv', fn: SIPrefix('Sv', -1) },
- { name: 'microSievert (µSv)', id: 'radusv', fn: SIPrefix('Sv', -2) },
- { name: 'rem', id: 'radrem', fn: SIPrefix('rem') },
- { name: 'Exposure (C/kg)', id: 'radexpckg', fn: SIPrefix('C/kg') },
- { name: 'roentgen (R)', id: 'radr', fn: SIPrefix('R') },
- { name: 'Sievert/hour (Sv/h)', id: 'radsvh', fn: SIPrefix('Sv/h') },
- { name: 'milliSievert/hour (mSv/h)', id: 'radmsvh', fn: SIPrefix('Sv/h', -1) },
- { name: 'microSievert/hour (µSv/h)', id: 'radusvh', fn: SIPrefix('Sv/h', -2) },
+ {
+ name: t('grafana-data.valueFormats.categories.radiation.formats.name-becquerel', 'Becquerel (Bq)'),
+ id: 'radbq',
+ fn: SIPrefix('Bq'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.radiation.formats.name-curie', 'curie (Ci)'),
+ id: 'radci',
+ fn: SIPrefix('Ci'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.radiation.formats.name-gray', 'Gray (Gy)'),
+ id: 'radgy',
+ fn: SIPrefix('Gy'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.radiation.formats.name-rad', 'rad'),
+ id: 'radrad',
+ fn: SIPrefix('rad'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.radiation.formats.name-sievert', 'Sievert (Sv)'),
+ id: 'radsv',
+ fn: SIPrefix('Sv'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.radiation.formats.name-millisievert', 'milliSievert (mSv)'),
+ id: 'radmsv',
+ fn: SIPrefix('Sv', -1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.radiation.formats.name-microsievert', 'microSievert (µSv)'),
+ id: 'radusv',
+ fn: SIPrefix('Sv', -2),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.radiation.formats.name-rem', 'rem'),
+ id: 'radrem',
+ fn: SIPrefix('rem'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.radiation.formats.name-exposure', 'Exposure (C/kg)'),
+ id: 'radexpckg',
+ fn: SIPrefix('C/kg'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.radiation.formats.name-roentgen', 'roentgen (R)'),
+ id: 'radr',
+ fn: SIPrefix('R'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.radiation.formats.name-sievert-hour', 'Sievert/hour (Sv/h)'),
+ id: 'radsvh',
+ fn: SIPrefix('Sv/h'),
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.radiation.formats.name-millisievert-hour',
+ 'milliSievert/hour (mSv/h)'
+ ),
+ id: 'radmsvh',
+ fn: SIPrefix('Sv/h', -1),
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.radiation.formats.name-microsievert-hour',
+ 'microSievert/hour (µSv/h)'
+ ),
+ id: 'radusvh',
+ fn: SIPrefix('Sv/h', -2),
+ },
],
},
{
- name: 'Rotational Speed',
+ name: t('grafana-data.valueFormats.categories.rotational-speed.name', 'Rotational Speed'),
formats: [
- { name: 'Revolutions per minute (rpm)', id: 'rotrpm', fn: toFixedUnit('rpm') },
- { name: 'Hertz (Hz)', id: 'rothz', fn: SIPrefix('Hz') },
- { name: 'Kilohertz (kHz)', id: 'rotkhz', fn: SIPrefix('Hz', 1) },
- { name: 'Megahertz (MHz)', id: 'rotmhz', fn: SIPrefix('Hz', 2) },
- { name: 'Gigahertz (GHz)', id: 'rotghz', fn: SIPrefix('Hz', 3) },
- { name: 'Radians per second (rad/s)', id: 'rotrads', fn: toFixedUnit('rad/s') },
- { name: 'Degrees per second (°/s)', id: 'rotdegs', fn: toFixedUnit('°/s') },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.rotational-speed.formats.name-rpm',
+ 'Revolutions per minute (rpm)'
+ ),
+ id: 'rotrpm',
+ fn: toFixedUnit('rpm'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.rotational-speed.formats.name-hertz', 'Hertz (Hz)'),
+ id: 'rothz',
+ fn: SIPrefix('Hz'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.rotational-speed.formats.name-kilohertz', 'Kilohertz (kHz)'),
+ id: 'rotkhz',
+ fn: SIPrefix('Hz', 1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.rotational-speed.formats.name-megahertz', 'Megahertz (MHz)'),
+ id: 'rotmhz',
+ fn: SIPrefix('Hz', 2),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.rotational-speed.formats.name-gigahertz', 'Gigahertz (GHz)'),
+ id: 'rotghz',
+ fn: SIPrefix('Hz', 3),
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.rotational-speed.formats.name-radians-sec',
+ 'Radians per second (rad/s)'
+ ),
+ id: 'rotrads',
+ fn: toFixedUnit('rad/s'),
+ },
+ {
+ name: t(
+ 'grafana-data.valueFormats.categories.rotational-speed.formats.name-degrees-sec',
+ 'Degrees per second (°/s)'
+ ),
+ id: 'rotdegs',
+ fn: toFixedUnit('°/s'),
+ },
],
},
{
- name: 'Temperature',
+ name: t('grafana-data.valueFormats.categories.temperature.name', 'Temperature'),
formats: [
- { name: 'Celsius (°C)', id: 'celsius', fn: toFixedUnit('°C') },
- { name: 'Fahrenheit (°F)', id: 'fahrenheit', fn: toFixedUnit('°F') },
- { name: 'Kelvin (K)', id: 'kelvin', fn: toFixedUnit('K') },
+ {
+ name: t('grafana-data.valueFormats.categories.temperature.formats.name-celsius', 'Celsius (°C)'),
+ id: 'celsius',
+ fn: toFixedUnit('°C'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.temperature.formats.name-fahrenheit', 'Fahrenheit (°F)'),
+ id: 'fahrenheit',
+ fn: toFixedUnit('°F'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.temperature.formats.name-kelvin', 'Kelvin (K)'),
+ id: 'kelvin',
+ fn: toFixedUnit('K'),
+ },
],
},
{
- name: 'Time',
+ name: t('grafana-data.valueFormats.categories.time.name', 'Time'),
formats: [
- { name: 'Hertz (1/s)', id: 'hertz', fn: SIPrefix('Hz') },
- { name: 'nanoseconds (ns)', id: 'ns', fn: toNanoSeconds },
- { name: 'microseconds (µs)', id: 'µs', fn: toMicroSeconds },
- { name: 'milliseconds (ms)', id: 'ms', fn: toMilliSeconds },
- { name: 'seconds (s)', id: 's', fn: toSeconds },
- { name: 'minutes (m)', id: 'm', fn: toMinutes },
- { name: 'hours (h)', id: 'h', fn: toHours },
- { name: 'days (d)', id: 'd', fn: toDays },
- { name: 'duration (ms)', id: 'dtdurationms', fn: toDurationInMilliseconds },
- { name: 'duration (s)', id: 'dtdurations', fn: toDurationInSeconds },
- { name: 'duration (hh:mm:ss)', id: 'dthms', fn: toDurationInHoursMinutesSeconds },
- { name: 'duration (d hh:mm:ss)', id: 'dtdhms', fn: toDurationInDaysHoursMinutesSeconds },
- { name: 'Timeticks (s/100)', id: 'timeticks', fn: toTimeTicks },
- { name: 'clock (ms)', id: 'clockms', fn: toClockMilliseconds },
- { name: 'clock (s)', id: 'clocks', fn: toClockSeconds },
+ {
+ name: t('grafana-data.valueFormats.categories.time.formats.name-hertz', 'Hertz (1/s)'),
+ id: 'hertz',
+ fn: SIPrefix('Hz'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.time.formats.name-nanoseconds', 'nanoseconds (ns)'),
+ id: 'ns',
+ fn: toNanoSeconds,
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.time.formats.name-microseconds', 'microseconds (µs)'),
+ id: 'µs',
+ fn: toMicroSeconds,
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.time.formats.name-milliseconds', 'milliseconds (ms)'),
+ id: 'ms',
+ fn: toMilliSeconds,
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.time.formats.name-seconds', 'seconds (s)'),
+ id: 's',
+ fn: toSeconds,
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.time.formats.name-minutes', 'minutes (m)'),
+ id: 'm',
+ fn: toMinutes,
+ },
+ { name: t('grafana-data.valueFormats.categories.time.formats.name-hours', 'hours (h)'), id: 'h', fn: toHours },
+ { name: t('grafana-data.valueFormats.categories.time.formats.name-days', 'days (d)'), id: 'd', fn: toDays },
+ {
+ name: t('grafana-data.valueFormats.categories.time.formats.name-duration-ms', 'duration (ms)'),
+ id: 'dtdurationms',
+ fn: toDurationInMilliseconds,
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.time.formats.name-duration-s', 'duration (s)'),
+ id: 'dtdurations',
+ fn: toDurationInSeconds,
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.time.formats.name-duration-hms', 'duration (hh:mm:ss)'),
+ id: 'dthms',
+ fn: toDurationInHoursMinutesSeconds,
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.time.formats.name-duration-dhms', 'duration (d hh:mm:ss)'),
+ id: 'dtdhms',
+ fn: toDurationInDaysHoursMinutesSeconds,
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.time.formats.name-timeticks', 'Timeticks (s/100)'),
+ id: 'timeticks',
+ fn: toTimeTicks,
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.time.formats.name-clock-ms', 'clock (ms)'),
+ id: 'clockms',
+ fn: toClockMilliseconds,
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.time.formats.name-clock-s', 'clock (s)'),
+ id: 'clocks',
+ fn: toClockSeconds,
+ },
],
},
{
- name: 'Throughput',
+ name: t('grafana-data.valueFormats.categories.throughput.name', 'Throughput'),
formats: [
- { name: 'counts/sec (cps)', id: 'cps', fn: simpleCountUnit('c/s') },
- { name: 'ops/sec (ops)', id: 'ops', fn: simpleCountUnit('ops/s') },
- { name: 'requests/sec (rps)', id: 'reqps', fn: simpleCountUnit('req/s') },
- { name: 'reads/sec (rps)', id: 'rps', fn: simpleCountUnit('rd/s') },
- { name: 'writes/sec (wps)', id: 'wps', fn: simpleCountUnit('wr/s') },
- { name: 'I/O ops/sec (iops)', id: 'iops', fn: simpleCountUnit('io/s') },
- { name: 'events/sec (eps)', id: 'eps', fn: simpleCountUnit('evt/s') },
- { name: 'messages/sec (mps)', id: 'mps', fn: simpleCountUnit('msg/s') },
- { name: 'records/sec (rps)', id: 'recps', fn: simpleCountUnit('rec/s') },
- { name: 'rows/sec (rps)', id: 'rowsps', fn: simpleCountUnit('rows/s') },
- { name: 'counts/min (cpm)', id: 'cpm', fn: simpleCountUnit('c/m') },
- { name: 'ops/min (opm)', id: 'opm', fn: simpleCountUnit('ops/m') },
- { name: 'requests/min (rpm)', id: 'reqpm', fn: simpleCountUnit('req/m') },
- { name: 'reads/min (rpm)', id: 'rpm', fn: simpleCountUnit('rd/m') },
- { name: 'writes/min (wpm)', id: 'wpm', fn: simpleCountUnit('wr/m') },
- { name: 'events/min (epm)', id: 'epm', fn: simpleCountUnit('evts/m') },
- { name: 'messages/min (mpm)', id: 'mpm', fn: simpleCountUnit('msgs/m') },
- { name: 'records/min (rpm)', id: 'recpm', fn: simpleCountUnit('rec/m') },
- { name: 'rows/min (rpm)', id: 'rowspm', fn: simpleCountUnit('rows/m') },
+ {
+ name: t('grafana-data.valueFormats.categories.throughput.formats.name-counts-sec', 'counts/sec (cps)'),
+ id: 'cps',
+ fn: simpleCountUnit('c/s'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.throughput.formats.name-ops-sec', 'ops/sec (ops)'),
+ id: 'ops',
+ fn: simpleCountUnit('ops/s'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.throughput.formats.name-requests-sec', 'requests/sec (rps)'),
+ id: 'reqps',
+ fn: simpleCountUnit('req/s'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.throughput.formats.name-reads-sec', 'reads/sec (rps)'),
+ id: 'rps',
+ fn: simpleCountUnit('rd/s'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.throughput.formats.name-writes-sec', 'writes/sec (wps)'),
+ id: 'wps',
+ fn: simpleCountUnit('wr/s'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.throughput.formats.name-io-ops-sec', 'I/O ops/sec (iops)'),
+ id: 'iops',
+ fn: simpleCountUnit('io/s'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.throughput.formats.name-events-sec', 'events/sec (eps)'),
+ id: 'eps',
+ fn: simpleCountUnit('evt/s'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.throughput.formats.name-messages-sec', 'messages/sec (mps)'),
+ id: 'mps',
+ fn: simpleCountUnit('msg/s'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.throughput.formats.name-records-sec', 'records/sec (rps)'),
+ id: 'recps',
+ fn: simpleCountUnit('rec/s'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.throughput.formats.name-rows-sec', 'rows/sec (rps)'),
+ id: 'rowsps',
+ fn: simpleCountUnit('rows/s'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.throughput.formats.name-counts-min', 'counts/min (cpm)'),
+ id: 'cpm',
+ fn: simpleCountUnit('c/m'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.throughput.formats.name-ops-min', 'ops/min (opm)'),
+ id: 'opm',
+ fn: simpleCountUnit('ops/m'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.throughput.formats.name-requests-min', 'requests/min (rpm)'),
+ id: 'reqpm',
+ fn: simpleCountUnit('req/m'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.throughput.formats.name-reads-min', 'reads/min (rpm)'),
+ id: 'rpm',
+ fn: simpleCountUnit('rd/m'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.throughput.formats.name-writes-min', 'writes/min (wpm)'),
+ id: 'wpm',
+ fn: simpleCountUnit('wr/m'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.throughput.formats.name-events-min', 'events/min (epm)'),
+ id: 'epm',
+ fn: simpleCountUnit('evts/m'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.throughput.formats.name-messages-min', 'messages/min (mpm)'),
+ id: 'mpm',
+ fn: simpleCountUnit('msgs/m'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.throughput.formats.name-records-min', 'records/min (rpm)'),
+ id: 'recpm',
+ fn: simpleCountUnit('rec/m'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.throughput.formats.name-rows-min', 'rows/min (rpm)'),
+ id: 'rowspm',
+ fn: simpleCountUnit('rows/m'),
+ },
],
},
{
- name: 'Velocity',
+ name: t('grafana-data.valueFormats.categories.velocity.name', 'Velocity'),
formats: [
- { name: 'meters/second (m/s)', id: 'velocityms', fn: toFixedUnit('m/s') },
- { name: 'kilometers/hour (km/h)', id: 'velocitykmh', fn: toFixedUnit('km/h') },
- { name: 'miles/hour (mph)', id: 'velocitymph', fn: toFixedUnit('mph') },
- { name: 'knot (kn)', id: 'velocityknot', fn: toFixedUnit('kn') },
+ {
+ name: t('grafana-data.valueFormats.categories.velocity.formats.name-meters-second', 'meters/second (m/s)'),
+ id: 'velocityms',
+ fn: toFixedUnit('m/s'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.velocity.formats.name-kilometers-hour', 'kilometers/hour (km/h)'),
+ id: 'velocitykmh',
+ fn: toFixedUnit('km/h'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.velocity.formats.name-miles-hour', 'miles/hour (mph)'),
+ id: 'velocitymph',
+ fn: toFixedUnit('mph'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.velocity.formats.name-knot', 'knot (kn)'),
+ id: 'velocityknot',
+ fn: toFixedUnit('kn'),
+ },
],
},
{
- name: 'Volume',
+ name: t('grafana-data.valueFormats.categories.volume.name', 'Volume'),
formats: [
- { name: 'millilitre (mL)', id: 'mlitre', fn: SIPrefix('L', -1) },
- { name: 'litre (L)', id: 'litre', fn: SIPrefix('L') },
- { name: 'cubic meter', id: 'm3', fn: toFixedUnit('m³') },
- { name: 'Normal cubic meter', id: 'Nm3', fn: toFixedUnit('Nm³') },
- { name: 'cubic decimeter', id: 'dm3', fn: toFixedUnit('dm³') },
- { name: 'gallons', id: 'gallons', fn: toFixedUnit('gal') },
+ {
+ name: t('grafana-data.valueFormats.categories.volume.formats.name-millilitre', 'millilitre (mL)'),
+ id: 'mlitre',
+ fn: SIPrefix('L', -1),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.volume.formats.name-litre', 'litre (L)'),
+ id: 'litre',
+ fn: SIPrefix('L'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.volume.formats.name-cubic-meter', 'cubic meter'),
+ id: 'm3',
+ fn: toFixedUnit('m³'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.volume.formats.name-normal-cubic-meter', 'Normal cubic meter'),
+ id: 'Nm3',
+ fn: toFixedUnit('Nm³'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.volume.formats.name-cubic-decimeter', 'cubic decimeter'),
+ id: 'dm3',
+ fn: toFixedUnit('dm³'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.volume.formats.name-gallons', 'gallons'),
+ id: 'gallons',
+ fn: toFixedUnit('gal'),
+ },
],
},
{
- name: 'Boolean',
+ name: t('grafana-data.valueFormats.categories.boolean.name', 'Boolean'),
formats: [
- { name: 'True / False', id: 'bool', fn: booleanValueFormatter('True', 'False') },
- { name: 'Yes / No', id: 'bool_yes_no', fn: booleanValueFormatter('Yes', 'No') },
- { name: 'On / Off', id: 'bool_on_off', fn: booleanValueFormatter('On', 'Off') },
+ {
+ name: t('grafana-data.valueFormats.categories.boolean.formats.name-true-false', 'True / False'),
+ id: 'bool',
+ fn: booleanValueFormatter('True', 'False'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.boolean.formats.name-yes-no', 'Yes / No'),
+ id: 'bool_yes_no',
+ fn: booleanValueFormatter('Yes', 'No'),
+ },
+ {
+ name: t('grafana-data.valueFormats.categories.boolean.formats.name-on-off', 'On / Off'),
+ id: 'bool_on_off',
+ fn: booleanValueFormatter('On', 'Off'),
+ },
],
},
];
diff --git a/packages/grafana-e2e-selectors/package.json b/packages/grafana-e2e-selectors/package.json
index 265adc2ffdb..d647d0fb88d 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": "12.1.0-pre",
+ "version": "12.2.0-pre",
"description": "Grafana End-to-End Test Selectors Library",
"keywords": [
"cli",
@@ -40,12 +40,12 @@
},
"devDependencies": {
"@rollup/plugin-node-resolve": "16.0.1",
- "@types/node": "22.15.0",
+ "@types/node": "22.16.5",
"@types/semver": "7.7.0",
- "esbuild": "0.25.6",
+ "esbuild": "0.25.8",
"rimraf": "6.0.1",
"rollup": "^4.22.4",
- "rollup-plugin-esbuild": "6.2.0",
+ "rollup-plugin-esbuild": "6.2.1",
"rollup-plugin-node-externals": "^8.0.0"
},
"dependencies": {
diff --git a/packages/grafana-e2e-selectors/rollup.config.ts b/packages/grafana-e2e-selectors/rollup.config.ts
index 9888b316a6a..1d47540a42a 100644
--- a/packages/grafana-e2e-selectors/rollup.config.ts
+++ b/packages/grafana-e2e-selectors/rollup.config.ts
@@ -10,5 +10,6 @@ export default [
input: entryPoint,
plugins,
output: [cjsOutput(pkg), esmOutput(pkg, 'grafana-e2e-selectors')],
+ treeshake: false,
},
];
diff --git a/packages/grafana-e2e-selectors/src/selectors/components.ts b/packages/grafana-e2e-selectors/src/selectors/components.ts
index 93e5a545d8c..adf4f2efbfe 100644
--- a/packages/grafana-e2e-selectors/src/selectors/components.ts
+++ b/packages/grafana-e2e-selectors/src/selectors/components.ts
@@ -481,6 +481,19 @@ export const versionedComponents = {
'10.2.0': 'data-testid table body',
},
},
+ TableNG: {
+ Filters: {
+ HeaderButton: {
+ '12.1.0': 'data-testid tableng header filter',
+ },
+ Container: {
+ '12.1.0': 'data-testid tablenf filter container',
+ },
+ SelectAll: {
+ '12.1.0': 'data-testid tableng filter select-all',
+ },
+ },
+ },
},
},
VizLegend: {
diff --git a/packages/grafana-eslint-rules/package.json b/packages/grafana-eslint-rules/package.json
index 58f95284f26..71203b6d524 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": "12.1.0-pre",
+ "version": "12.2.0-pre",
"main": "./index.cjs",
"author": "Grafana Labs",
"license": "Apache-2.0",
@@ -18,7 +18,7 @@
},
"devDependencies": {
"@typescript-eslint/types": "^8.9.0",
- "eslint": "9.19.0",
+ "eslint": "9.32.0",
"tslib": "2.8.1"
},
"private": true
diff --git a/packages/grafana-flamegraph/package.json b/packages/grafana-flamegraph/package.json
index 892771c1082..f8597f17c32 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": "12.1.0-pre",
+ "version": "12.2.0-pre",
"description": "Grafana flamegraph visualization component",
"keywords": [
"grafana",
@@ -44,8 +44,8 @@
],
"dependencies": {
"@emotion/css": "11.13.5",
- "@grafana/data": "12.1.0-pre",
- "@grafana/ui": "12.1.0-pre",
+ "@grafana/data": "12.2.0-pre",
+ "@grafana/ui": "12.2.0-pre",
"@leeoniya/ufuzzy": "1.0.18",
"d3": "^7.8.5",
"lodash": "4.17.21",
@@ -56,28 +56,28 @@
"tslib": "2.8.1"
},
"devDependencies": {
- "@babel/core": "7.26.10",
- "@babel/preset-env": "7.26.9",
- "@babel/preset-react": "7.26.3",
+ "@babel/core": "7.28.0",
+ "@babel/preset-env": "7.28.0",
+ "@babel/preset-react": "7.27.1",
"@grafana/tsconfig": "^2.0.0",
"@rollup/plugin-node-resolve": "16.0.1",
"@testing-library/dom": "10.4.0",
"@testing-library/jest-dom": "^6.1.2",
- "@testing-library/react": "16.2.0",
+ "@testing-library/react": "16.3.0",
"@testing-library/user-event": "14.6.1",
"@types/d3": "^7",
"@types/jest": "^29.5.4",
"@types/lodash": "4.17.20",
- "@types/node": "22.15.0",
+ "@types/node": "22.16.5",
"@types/react": "18.3.18",
"@types/react-virtualized-auto-sizer": "1.0.8",
"@types/tinycolor2": "1.4.6",
"babel-jest": "29.7.0",
- "esbuild": "0.25.6",
+ "esbuild": "0.25.8",
"jest": "^29.6.4",
"jest-canvas-mock": "2.5.2",
"rollup": "^4.22.4",
- "rollup-plugin-esbuild": "6.2.0",
+ "rollup-plugin-esbuild": "6.2.1",
"rollup-plugin-node-externals": "^8.0.0",
"ts-jest": "29.2.5",
"ts-node": "10.9.2",
diff --git a/packages/grafana-flamegraph/rollup.config.ts b/packages/grafana-flamegraph/rollup.config.ts
index 3bc2d6a540f..967916710d6 100644
--- a/packages/grafana-flamegraph/rollup.config.ts
+++ b/packages/grafana-flamegraph/rollup.config.ts
@@ -10,5 +10,6 @@ export default [
input: entryPoint,
plugins,
output: [cjsOutput(pkg), esmOutput(pkg, 'grafana-flamegraph')],
+ treeshake: false,
},
];
diff --git a/packages/grafana-i18n/package.json b/packages/grafana-i18n/package.json
index 9f2fd298de1..6ffd95918f4 100644
--- a/packages/grafana-i18n/package.json
+++ b/packages/grafana-i18n/package.json
@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/i18n",
- "version": "12.1.0-pre",
+ "version": "12.2.0-pre",
"description": "Grafana Internationalization Library",
"keywords": [
"grafana",
diff --git a/packages/grafana-i18n/rollup.config.ts b/packages/grafana-i18n/rollup.config.ts
index 3171639a367..1b1115f65c9 100644
--- a/packages/grafana-i18n/rollup.config.ts
+++ b/packages/grafana-i18n/rollup.config.ts
@@ -16,5 +16,6 @@ export default [
}),
],
output: [cjsOutput(pkg), esmOutput(pkg, 'grafana-i18n')],
+ treeshake: false,
},
];
diff --git a/packages/grafana-i18n/src/dates.ts b/packages/grafana-i18n/src/dates.ts
index db699e871ae..c75cd2c86f4 100644
--- a/packages/grafana-i18n/src/dates.ts
+++ b/packages/grafana-i18n/src/dates.ts
@@ -1,8 +1,13 @@
import deepEqual from 'fast-deep-equal';
-import memoize from 'micro-memoize';
+import memoize, { AnyFn, Memoized } from 'micro-memoize';
const deepMemoize: typeof memoize = (fn) => memoize(fn, { isEqual: deepEqual });
+function clearMemoizedCache(fn: Memoized) {
+ fn.cache.keys.length = 0;
+ fn.cache.values.length = 0;
+}
+
let regionalFormat: string | undefined;
const createDateTimeFormatter = deepMemoize((locale: string | undefined, options: Intl.DateTimeFormatOptions) => {
@@ -41,5 +46,10 @@ export const formatDateRange = (
};
export const initRegionalFormat = (regionalFormatArg: string) => {
+ // We don't expect this to be called with a different locale during the lifetime of the app,
+ // so this is mostly here so we can change it during tests and clear out previously memoized values.
+ clearMemoizedCache(formatDate);
+ clearMemoizedCache(formatDuration);
+
regionalFormat = regionalFormatArg;
};
diff --git a/packages/grafana-i18n/src/index.ts b/packages/grafana-i18n/src/index.ts
index a4ebd2b5289..8a83bb17c1b 100644
--- a/packages/grafana-i18n/src/index.ts
+++ b/packages/grafana-i18n/src/index.ts
@@ -24,4 +24,4 @@ export {
} from './constants';
export { initPluginTranslations, t, Trans } from './i18n';
export type { ResourceLoader, Resources, TFunction, TransProps } from './types';
-export { formatDate, formatDuration, formatDateRange } from './dates';
+export { formatDate, formatDuration, formatDateRange, initRegionalFormat as initRegionalFormatForTests } from './dates';
diff --git a/packages/grafana-o11y-ds-frontend/package.json b/packages/grafana-o11y-ds-frontend/package.json
index 18faf879904..1d56eb47a0e 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": "12.1.0-pre",
+ "version": "12.2.0-pre",
"description": "Library to manage traces in Grafana.",
"sideEffects": false,
"repository": {
@@ -18,12 +18,12 @@
},
"dependencies": {
"@emotion/css": "11.13.5",
- "@grafana/data": "12.1.0-pre",
- "@grafana/e2e-selectors": "12.1.0-pre",
+ "@grafana/data": "12.2.0-pre",
+ "@grafana/e2e-selectors": "12.2.0-pre",
"@grafana/plugin-ui": "0.10.7",
- "@grafana/runtime": "12.1.0-pre",
- "@grafana/schema": "12.1.0-pre",
- "@grafana/ui": "12.1.0-pre",
+ "@grafana/runtime": "12.2.0-pre",
+ "@grafana/schema": "12.2.0-pre",
+ "@grafana/ui": "12.2.0-pre",
"react-select": "5.10.2",
"react-use": "17.6.0",
"rxjs": "7.8.2",
@@ -33,10 +33,10 @@
"@grafana/tsconfig": "^2.0.0",
"@testing-library/dom": "10.4.0",
"@testing-library/jest-dom": "^6.1.2",
- "@testing-library/react": "16.2.0",
+ "@testing-library/react": "16.3.0",
"@testing-library/user-event": "14.6.1",
"@types/jest": "^29.5.4",
- "@types/node": "22.15.0",
+ "@types/node": "22.16.5",
"@types/react": "18.3.18",
"@types/systemjs": "6.15.3",
"jest": "^29.6.4",
diff --git a/packages/grafana-plugin-configs/package.json b/packages/grafana-plugin-configs/package.json
index f9c6f066c3f..3ca7029e86d 100644
--- a/packages/grafana-plugin-configs/package.json
+++ b/packages/grafana-plugin-configs/package.json
@@ -2,7 +2,7 @@
"name": "@grafana/plugin-configs",
"description": "Shared dependencies and files for core plugins",
"private": true,
- "version": "12.1.0-pre",
+ "version": "12.2.0-pre",
"dependencies": {
"tslib": "2.8.1"
},
@@ -15,9 +15,9 @@
"@types/eslint": "9.6.1",
"@types/webpack-bundle-analyzer": "^4.7.0",
"copy-webpack-plugin": "12.0.2",
- "eslint": "9.19.0",
+ "eslint": "9.32.0",
"eslint-webpack-plugin": "4.2.0",
- "fork-ts-checker-webpack-plugin": "9.0.2",
+ "fork-ts-checker-webpack-plugin": "9.1.0",
"glob": "11.0.3",
"identity-obj-proxy": "^3.0.0",
"imports-loader": "^5.0.0",
diff --git a/packages/grafana-prometheus/package.json b/packages/grafana-prometheus/package.json
index 2927ed8e76c..efd2b239574 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": "12.1.0-pre",
+ "version": "12.2.0-pre",
"description": "Grafana Prometheus Library",
"keywords": [
"typescript",
@@ -40,14 +40,14 @@
},
"dependencies": {
"@emotion/css": "11.13.5",
- "@floating-ui/react": "0.27.13",
- "@grafana/data": "12.1.0-pre",
- "@grafana/e2e-selectors": "12.1.0-pre",
- "@grafana/i18n": "12.1.0-pre",
+ "@floating-ui/react": "0.27.14",
+ "@grafana/data": "12.2.0-pre",
+ "@grafana/e2e-selectors": "12.2.0-pre",
+ "@grafana/i18n": "12.2.0-pre",
"@grafana/plugin-ui": "0.10.7",
- "@grafana/runtime": "12.1.0-pre",
- "@grafana/schema": "12.1.0-pre",
- "@grafana/ui": "12.1.0-pre",
+ "@grafana/runtime": "12.2.0-pre",
+ "@grafana/schema": "12.2.0-pre",
+ "@grafana/ui": "12.2.0-pre",
"@hello-pangea/dnd": "18.0.1",
"@leeoniya/ufuzzy": "1.0.18",
"@lezer/common": "1.2.3",
@@ -67,7 +67,7 @@
"lodash": "4.17.21",
"moment": "2.30.1",
"moment-timezone": "0.5.47",
- "monaco-promql": "1.7.4",
+ "monaco-promql": "1.8.0",
"pluralize": "8.0.0",
"prismjs": "1.30.0",
"react-highlight-words": "0.21.0",
@@ -84,13 +84,13 @@
"@rollup/plugin-json": "6.1.0",
"@rollup/plugin-node-resolve": "16.0.1",
"@testing-library/jest-dom": "6.6.3",
- "@testing-library/react": "16.2.0",
+ "@testing-library/react": "16.3.0",
"@testing-library/user-event": "14.6.1",
"@types/jest": "29.5.14",
- "@types/node": "22.15.0",
+ "@types/node": "22.16.5",
"@types/pluralize": "^0.0.33",
"@types/prismjs": "1.26.5",
- "esbuild": "0.25.6",
+ "esbuild": "0.25.8",
"i18next-parser": "9.3.0",
"jest": "29.7.0",
"jest-environment-jsdom": "29.7.0",
@@ -99,7 +99,7 @@
"react-select-event": "5.5.1",
"rimraf": "6.0.1",
"rollup": "^4.22.4",
- "rollup-plugin-esbuild": "6.2.0",
+ "rollup-plugin-esbuild": "6.2.1",
"rollup-plugin-node-externals": "^8.0.0",
"testing-library-selector": "0.3.1",
"typescript": "5.8.3"
diff --git a/packages/grafana-prometheus/rollup.config.ts b/packages/grafana-prometheus/rollup.config.ts
index be421e6c7aa..8dbc60c8935 100644
--- a/packages/grafana-prometheus/rollup.config.ts
+++ b/packages/grafana-prometheus/rollup.config.ts
@@ -13,5 +13,6 @@ export default [
input: entryPoint,
plugins: [...plugins, image(), json(), dynamicImportVars()],
output: [cjsOutput(pkg), esmOutput(pkg, 'grafana-prometheus')],
+ treeshake: false,
},
];
diff --git a/packages/grafana-prometheus/src/add_label_to_query.ts b/packages/grafana-prometheus/src/add_label_to_query.ts
index 7c75e6e14ec..06e82fcbf00 100644
--- a/packages/grafana-prometheus/src/add_label_to_query.ts
+++ b/packages/grafana-prometheus/src/add_label_to_query.ts
@@ -21,7 +21,7 @@ import { PromVisualQuery } from './querybuilder/types';
* @param operator
*/
export function addLabelToQuery(query: string, key: string, value: string | number, operator = '='): string {
- if (!key || !value) {
+ if (!key) {
throw new Error('Need label to add to query.');
}
diff --git a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/completions.test.ts b/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/completions.test.ts
index 88303e2503b..e6df676beba 100644
--- a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/completions.test.ts
+++ b/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/completions.test.ts
@@ -1,7 +1,7 @@
import { config } from '@grafana/runtime';
import { SUGGESTIONS_LIMIT } from '../../../constants';
-import { FUNCTIONS } from '../../../promql';
+import { getFunctions } from '../../../promql';
import { getMockTimeRange } from '../../../test/mocks/datasource';
import { filterMetricNames, getCompletions } from './completions';
@@ -172,7 +172,7 @@ const metricNameCompletionSituations = ['AT_ROOT', 'IN_FUNCTION', 'EMPTY'] as Me
function getSuggestionCountForSituation(situationType: MetricNameSituation, metricsCount: number): number {
const limitedMetricNamesCount = metricsCount < SUGGESTIONS_LIMIT ? metricsCount : SUGGESTIONS_LIMIT;
- let suggestionsCount = limitedMetricNamesCount + FUNCTIONS.length;
+ let suggestionsCount = limitedMetricNamesCount + getFunctions().length;
if (situationType === 'EMPTY') {
suggestionsCount += history.length;
diff --git a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/completions.ts b/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/completions.ts
index def4cd7eaaa..f7fc08f8bce 100644
--- a/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/completions.ts
+++ b/packages/grafana-prometheus/src/components/monaco-query-field/monaco-completion-provider/completions.ts
@@ -6,7 +6,7 @@ import { TimeRange } from '@grafana/data';
import { config } from '@grafana/runtime';
import { escapeLabelValueInExactSelector, prometheusRegularEscape } from '../../../escaping';
-import { FUNCTIONS } from '../../../promql';
+import { getFunctions } from '../../../promql';
import { isValidLegacyName } from '../../../utf8_support';
import { DataProvider } from './data_provider';
@@ -100,18 +100,20 @@ function getAllMetricNamesCompletions(dataProvider: DataProvider): Completion[]
}));
}
-const FUNCTION_COMPLETIONS: Completion[] = FUNCTIONS.map((f) => ({
- type: 'FUNCTION',
- label: f.label,
- insertText: f.insertText ?? '', // i don't know what to do when this is nullish. it should not be.
- detail: f.detail,
- documentation: f.documentation,
-}));
+const getFunctionCompletions: () => Completion[] = () => {
+ return getFunctions().map((f) => ({
+ type: 'FUNCTION',
+ label: f.label,
+ insertText: f.insertText ?? '', // i don't know what to do when this is nullish. it should not be.
+ detail: f.detail,
+ documentation: f.documentation,
+ }));
+};
async function getAllFunctionsAndMetricNamesCompletions(dataProvider: DataProvider): Promise {
const metricNames = getAllMetricNamesCompletions(dataProvider);
- return [...FUNCTION_COMPLETIONS, ...metricNames];
+ return [...getFunctionCompletions(), ...metricNames];
}
const DURATION_COMPLETIONS: Completion[] = [
@@ -276,7 +278,7 @@ export function getCompletions(
case 'EMPTY': {
const metricNames = getAllMetricNamesCompletions(dataProvider);
const historyCompletions = getAllHistoryCompletions(dataProvider);
- return Promise.resolve([...historyCompletions, ...FUNCTION_COMPLETIONS, ...metricNames]);
+ return Promise.resolve([...historyCompletions, ...getFunctionCompletions(), ...metricNames]);
}
case 'IN_LABEL_SELECTOR_NO_LABEL_NAME':
return getLabelNamesForSelectorCompletions(situation.metricName, situation.otherLabels, dataProvider, timeRange);
diff --git a/packages/grafana-prometheus/src/language_provider.ts b/packages/grafana-prometheus/src/language_provider.ts
index 3ff374771d7..0419295ab16 100644
--- a/packages/grafana-prometheus/src/language_provider.ts
+++ b/packages/grafana-prometheus/src/language_provider.ts
@@ -515,19 +515,6 @@ export default class PromQlLanguageProvider extends LanguageProvider implements
};
}
-export interface PrometheusLanguageProviderInterface
- extends PrometheusBaseLanguageProvider,
- PrometheusLegacyLanguageProvider {
- retrieveMetricsMetadata: () => PromMetricsMetadata;
- retrieveHistogramMetrics: () => string[];
- retrieveMetrics: () => string[];
- retrieveLabelKeys: () => string[];
-
- queryMetricsMetadata: (limit?: number) => Promise;
- queryLabelKeys: (timeRange: TimeRange, match?: string, limit?: number) => Promise;
- queryLabelValues: (timeRange: TimeRange, labelKey: string, match?: string, limit?: number) => Promise;
-}
-
/**
* Modern implementation of the Prometheus language provider that abstracts API endpoint selection.
*
@@ -535,12 +522,73 @@ export interface PrometheusLanguageProviderInterface
* - Automatically selects the most efficient API endpoint based on Prometheus version and configuration
* - Supports both labels and series endpoints for backward compatibility
* - Handles match[] parameters for filtering time series data
- * - Implements automatic request limiting (default: 40_000 series)
+ * - Implements automatic request limiting (default: 40,000 series if not configured otherwise)
* - Provides unified interface for both modern and legacy Prometheus versions
+ * - Provides caching mechanism based on time range, limit, and match parameters
*
* @see LabelsApiClient For modern Prometheus versions using the labels API
* @see SeriesApiClient For legacy Prometheus versions using the series API
*/
+export interface PrometheusLanguageProviderInterface
+ extends PrometheusBaseLanguageProvider,
+ PrometheusLegacyLanguageProvider {
+ /**
+ * Initializes the language provider by fetching metrics, label keys, and metrics metadata using Resource Clients.
+ * All calls use the limit parameter from datasource configuration (default: 40,000 if not set).
+ *
+ * For backward compatibility, it calls _backwardCompatibleStart.
+ * Some places still rely on deprecated fields. Until we replace them, we need _backwardCompatibleStart method.
+ */
+ start: (timeRange?: TimeRange) => Promise;
+
+ /**
+ * Returns already cached metrics metadata including type and help information.
+ * If there is no cached metadata, it returns an empty object.
+ * To get fresh metadata, use queryMetricsMetadata instead.
+ */
+ retrieveMetricsMetadata: () => PromMetricsMetadata;
+
+ /**
+ * Returns already cached list of histogram metrics (identified by '_bucket' suffix).
+ * If there are no cached histogram metrics, it returns an empty array.
+ */
+ retrieveHistogramMetrics: () => string[];
+
+ /**
+ * Returns already cached list of all available metric names.
+ * If there are no cached metrics, it returns an empty array.
+ */
+ retrieveMetrics: () => string[];
+
+ /**
+ * Returns already cached list of available label keys.
+ * If there are no cached label keys, it returns an empty array.
+ */
+ retrieveLabelKeys: () => string[];
+
+ /**
+ * Fetches fresh metrics metadata from Prometheus with optional limit.
+ * Uses datasource's default limit if not specified.
+ */
+ queryMetricsMetadata: (limit?: number) => Promise;
+
+ /**
+ * Queries Prometheus for label keys within time range, optionally filtered by match selector.
+ * Automatically selects labels or series endpoint based on datasource configuration.
+ * If no limit is provided, uses the datasource's default limit configuration.
+ * Use zero (0) to fetch all label keys, but this might return huge amounts of data.
+ */
+ queryLabelKeys: (timeRange: TimeRange, match?: string, limit?: number) => Promise;
+
+ /**
+ * Queries Prometheus for values of a specific label key, optionally filtered by match selector.
+ * Automatically selects labels or series endpoint based on datasource configuration.
+ * If no limit is provided, uses the datasource's default limit configuration.
+ * Use zero (0) to fetch all label values, but this might return huge amounts of data.
+ */
+ queryLabelValues: (timeRange: TimeRange, labelKey: string, match?: string, limit?: number) => Promise;
+}
+
export class PrometheusLanguageProvider extends PromQlLanguageProvider implements PrometheusLanguageProviderInterface {
private _metricsMetadata?: PromMetricsMetadata;
private _resourceClient?: ResourceApiClient;
diff --git a/packages/grafana-prometheus/src/language_utils.test.ts b/packages/grafana-prometheus/src/language_utils.test.ts
index 5ba14363da7..555634f898e 100644
--- a/packages/grafana-prometheus/src/language_utils.test.ts
+++ b/packages/grafana-prometheus/src/language_utils.test.ts
@@ -191,6 +191,18 @@ describe('expandRecordingRules()', () => {
const result = expandRecordingRules(query, mapping);
expect(result).toBe(expected);
});
+
+ it('when there is an empty label value it should still be able to expand the rule', () => {
+ const query = `sum(max by (cluster, container) (pod_cpu:active:kube_limits{container!="", cluster=~"pink"}))`;
+ const mapping = {
+ 'pod_cpu:active:kube_limits': {
+ expandedQuery: `kube_limits{job!="", resource="cpu"} * on (namespace, pod, cluster) group_left () max by (namespace, pod, cluster) ((kube_pod_status_phase{phase=~"Pending|Running"} == 1))`,
+ },
+ };
+ const expected = `sum(max by (cluster, container) (kube_limits{job!="", resource="cpu", container!="", cluster=~"pink"} * on (namespace, pod, cluster) group_left () max by (namespace, pod, cluster) ((kube_pod_status_phase{phase=~"Pending|Running", container!="", cluster=~"pink"} == 1))))`;
+ const result = expandRecordingRules(query, mapping);
+ expect(result).toBe(expected);
+ });
});
describe('escapeLabelValueInExactSelector()', () => {
diff --git a/packages/grafana-prometheus/src/locales/cs-CZ/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/cs-CZ/grafana-prometheus.json
index 8498c0ce6df..57f9cec30c7 100644
--- a/packages/grafana-prometheus/src/locales/cs-CZ/grafana-prometheus.json
+++ b/packages/grafana-prometheus/src/locales/cs-CZ/grafana-prometheus.json
@@ -209,6 +209,103 @@
"label-verbose": ""
}
},
+ "promql": {
+ "getAggregationOptions": {
+ "documentation-avg": "",
+ "documentation-bottomk": "",
+ "documentation-count": "",
+ "documentation-count-values": "",
+ "documentation-group": "",
+ "documentation-max": "",
+ "documentation-min": "",
+ "documentation-quantile": "",
+ "documentation-stddev": "",
+ "documentation-stdvar": "",
+ "documentation-sum": "",
+ "documentation-topk": ""
+ },
+ "getFunctions": {
+ "documentation-abs": "",
+ "documentation-absent": "",
+ "documentation-absent-over-time": "",
+ "documentation-avg-over-time": "",
+ "documentation-ceil": "",
+ "documentation-changes": "",
+ "documentation-clamp": "",
+ "documentation-clamp-max": "",
+ "documentation-clamp-min": "",
+ "documentation-count-over-time": "",
+ "documentation-count-scalar": "",
+ "documentation-day-of-month": "",
+ "documentation-day-of-week": "",
+ "documentation-day-of-year": "",
+ "documentation-days-in-month": "",
+ "documentation-deg": "",
+ "documentation-delta": "",
+ "documentation-deriv": "",
+ "documentation-double-exponential-smoothing": "",
+ "documentation-drop-common-labels": "",
+ "documentation-exp": "",
+ "documentation-floor": "",
+ "documentation-histogram-avg": "",
+ "documentation-histogram-count": "",
+ "documentation-histogram-fraction": "",
+ "documentation-histogram-quantile": "",
+ "documentation-histogram-stddev": "",
+ "documentation-histogram-stdvar": "",
+ "documentation-histogram-sum": "",
+ "documentation-holt-winters": "",
+ "documentation-hour": "",
+ "documentation-idelta": "",
+ "documentation-increase": "",
+ "documentation-info": "",
+ "documentation-irate": "",
+ "documentation-label-join": "",
+ "documentation-label-replace": "",
+ "documentation-last-over-time": "",
+ "documentation-ln": "",
+ "documentation-log10": "",
+ "documentation-log2": "",
+ "documentation-max-over-time": "",
+ "documentation-min-over-time": "",
+ "documentation-minute": "",
+ "documentation-month": "",
+ "documentation-pi": "",
+ "documentation-predict-linear": "",
+ "documentation-present-over-time": "",
+ "documentation-quantile-over-time": "",
+ "documentation-rad": "",
+ "documentation-rate": "",
+ "documentation-resets": "",
+ "documentation-round": "",
+ "documentation-scalar": "",
+ "documentation-sgn": "",
+ "documentation-sort": "",
+ "documentation-sort-desc": "",
+ "documentation-sqrt": "",
+ "documentation-stddev-over-time": "",
+ "documentation-stdvar-over-time": "",
+ "documentation-sum-over-time": "",
+ "documentation-time": "",
+ "documentation-timestamp": "",
+ "documentation-vector": "",
+ "documentation-year": ""
+ },
+ "getTrigonometricFunctions": {
+ "documentation-acos": "",
+ "documentation-acosh": "",
+ "documentation-asin": "",
+ "documentation-asinh": "",
+ "documentation-atan": "",
+ "documentation-atanh": "",
+ "documentation-cos": "",
+ "documentation-cosh": "",
+ "documentation-sin": "",
+ "documentation-sinh": "",
+ "documentation-tan": "",
+ "documentation-tanh": ""
+ }
+ },
"querybuilder": {
"additional-settings": {
"content-filter-metric-names-regex-search-using": "Filtrovat názvy metrik podle vyhledávání regulárních výrazů pomocí dalšího volání rozhraní Prometheus API.",
@@ -321,6 +418,13 @@
"title-add": "Přidat {{name}}",
"title-remove": "Odebrat {{name}}"
},
+ "operation-utils": {
+ "getAggregationExplainer": {
+ "label-by": "",
+ "label-default": "",
+ "label-without": ""
+ }
+ },
"prom-query-builder-options": {
"aria-label-lower-limit-parameter": "Nastavit dolní limit pro parametr kroku",
"aria-label-select-resolution": "Vyberte rozlišení",
diff --git a/packages/grafana-prometheus/src/locales/de-DE/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/de-DE/grafana-prometheus.json
index b34304ade03..d3c2c2e1743 100644
--- a/packages/grafana-prometheus/src/locales/de-DE/grafana-prometheus.json
+++ b/packages/grafana-prometheus/src/locales/de-DE/grafana-prometheus.json
@@ -2,201 +2,201 @@
"grafana-prometheus": {
"components": {
"annotation-query-editor": {
- "annotation-data-load-error": "",
- "aria-label-lower-limit-parameter": "",
- "label-min-step": "",
- "label-series-value-as-timestamp": "",
+ "annotation-data-load-error": "Fehler beim Laden der Anmerkungsdaten!",
+ "aria-label-lower-limit-parameter": "Untergrenze für den Schrittparameter festlegen",
+ "label-min-step": "Min. Schritt",
+ "label-series-value-as-timestamp": "Reihenwert als Zeitstempel",
"label-tags": "Tags",
- "label-text": "",
+ "label-text": "Text",
"label-title": "Titel",
- "placeholder-auto": "",
- "tooltip-either-pattern-example-instance-replaced-label": "",
- "tooltip-min-step": "",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": ""
+ "placeholder-auto": "Auto",
+ "tooltip-either-pattern-example-instance-replaced-label": "Verwenden Sie entweder den Namen oder ein Muster. Ein Beispiel: {{labelTemplate}} wird durch den Label-Wert für das Label {{labelName}} ersetzt.",
+ "tooltip-min-step": "Eine zusätzliche Untergrenze für den Schrittparameter der Prometheus-Abfrage und für die Variablen <2>{{intervalVar}}2> und <4>{{rateIntervalVar}}4>.",
+ "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "Die Einheit des Zeitstempels ist Millisekunden. Wenn die Einheit des Reihenwerts Sekunden ist, multiplizieren Sie den Bereichsvektor mit 1000."
},
"get-query-type-options": {
"description": {
- "instant-query-range": ""
+ "instant-query-range": "Eine Instant-Abfrage und eine Bereichsabfrage ausführen"
},
"label": {
- "both": ""
+ "both": "Beides"
},
"range-options": {
"description": {
- "query-range": ""
+ "query-range": "Abfrage über einen bestimmten Zeitraum ausführen"
},
"label": {
- "instant": "",
- "range": ""
+ "instant": "Instant",
+ "range": "Bereich"
}
}
},
"label-selector": {
- "aria-label-filter-expression-for-label": "",
- "description-select-labels": "",
- "select-labels-to-search-in": ""
+ "aria-label-filter-expression-for-label": "Filterausdruck für Label",
+ "description-select-labels": "Sobald die Label-Werte ausgewählt sind, werden nur mögliche Label-Kombinationen angezeigt.",
+ "select-labels-to-search-in": "2. Wählen Sie Labels aus, in denen gesucht werden soll"
},
"metric-selector": {
- "aria-label-filter-expression-for-metric": "",
- "aria-label-limit-results-from-series-endpoint": "",
- "description-series-limit": "",
- "label-select-metric": "",
- "select-a-metric": "",
- "series-limit": ""
+ "aria-label-filter-expression-for-metric": "Filterausdruck für Metrik",
+ "aria-label-limit-results-from-series-endpoint": "Ergebnisse vom Reihenendpunkt begrenzen",
+ "description-series-limit": "Die Grenze gilt für alle Metriken, Labels und Werte. Wenn Sie das Feld leer lassen, wird die Standardgrenze verwendet. Durch eine Einstellung auf 0 wird die Grenze deaktiviert und alles abgerufen – dies kann zu Leistungsproblemen führen.",
+ "label-select-metric": "Sobald eine Metrik ausgewählt ist, werden nur mögliche Labels angezeigt. Labels werden durch die folgende Reihengrenze begrenzt.",
+ "select-a-metric": "1. Metrik auswählen",
+ "series-limit": "Reihengrenze"
},
"prom-cheat-sheet": {
- "prom-ql-cheat-sheet": ""
+ "prom-ql-cheat-sheet": "PromQL Cheat Sheet"
},
"prom-exemplar-field": {
- "exemplars": "",
- "tooltip-disable-query": "",
- "tooltip-enable-query": ""
+ "exemplars": "Exemplare",
+ "tooltip-disable-query": "Abfrage mit Exemplaren deaktivieren",
+ "tooltip-enable-query": "Abfrage mit Exemplaren aktivieren"
},
"prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "",
- "aria-label-query-type-field": "",
- "aria-label-step-field": "",
- "min-step": "",
- "query-type": "",
- "tooltip-units-builtin-variables-example-interval-rateinterval": ""
+ "aria-label-prometheus-extra-field": "Zusätzliches Feld in Prometheus",
+ "aria-label-query-type-field": "Abfragetyp-Feld",
+ "aria-label-step-field": "Schrittfeld",
+ "min-step": "Min. Schritt",
+ "query-type": "Abfragetyp",
+ "tooltip-units-builtin-variables-example-interval-rateinterval": "Hier können Zeiteinheiten und integrierte Variablen verwendet werden, zum Beispiel: {{example1}}, {{example2}}, {{example3}}, {{example4}}, {{example5}}, {{example6}}, {{example7}} (Standardwert bei fehlender Einheit: {{default}})"
},
"prom-query-field": {
- "placeholder-enter-a-prom-ql-query": ""
+ "placeholder-enter-a-prom-ql-query": "Geben Sie eine PromQL-Abfrage ein …"
},
"prom-variable-query-editor": {
- "aria-label-classic-query": "",
- "aria-label-metric-regex": "",
- "aria-label-metric-selector": "",
- "aria-label-prometheus-query": "",
- "aria-label-query-type": "",
- "aria-label-series-query": "",
- "label-classic-query": "",
+ "aria-label-classic-query": "Klassische Abfrage",
+ "aria-label-metric-regex": "Metrik-Regex",
+ "aria-label-metric-selector": "Metrik-Selektor",
+ "aria-label-prometheus-query": "Prometheus-Abfrage",
+ "aria-label-query-type": "Abfragetyp",
+ "aria-label-series-query": "Reihenabfrage",
+ "label-classic-query": "Klassische Abfrage",
"label-label": "Label",
- "label-metric-regex": "",
+ "label-metric-regex": "Metrik-RegEx",
"label-query": "Abfrage",
- "label-query-type": "",
- "label-series-query": "",
- "placeholder-classic-query": "",
- "placeholder-metric-regex": "",
- "placeholder-prometheus-query": "",
+ "label-query-type": "Abfragetyp",
+ "label-series-query": "Reihenabfrage",
+ "placeholder-classic-query": "Klassische Abfrage",
+ "placeholder-metric-regex": "Metrik-Regex",
+ "placeholder-prometheus-query": "Prometheus-Abfrage",
"placeholder-select-query-type": "Abfragetyp auswählen",
- "placeholder-series-query": "",
- "returns-metrics-matching-specified-metric-regex": "",
- "tooltip-classic-query": "",
- "tooltip-label": "",
- "tooltip-metric-regex": "",
- "tooltip-query": "",
- "tooltip-query-type": "",
- "tooltip-series-query": ""
+ "placeholder-series-query": "Reihenabfrage",
+ "returns-metrics-matching-specified-metric-regex": "Gibt eine Liste von Metriken zurück, die mit dem angegebenen Metrik-Regex übereinstimmen.",
+ "tooltip-classic-query": "Die ursprüngliche Implementierung des Prometheus-Variablen-Abfrageeditors. Geben Sie eine Zeichenfolge mit dem richtigen Abfragetyp und den richtigen Parametern ein, wie in diesen Dokumenten beschrieben. Zum Beispiel: {{exampleQuery}}.",
+ "tooltip-label": "Gibt eine Liste von Label-Werten für den Label-Namen in allen Metriken zurück, es sei denn, die Metrik ist angegeben.",
+ "tooltip-metric-regex": "Gibt eine Liste von Label-Namen zurück, die optional gemäß dem angegebenen Metrik-Regex gefiltert werden.",
+ "tooltip-query": "Gibt eine Liste der Prometheus-Abfrageergebnisse für die Abfrage zurück. Dies kann Prometheus-Funktionen umfassen, z. B. {{exampleQuery}}.",
+ "tooltip-query-type": "Das Prometheus-Datenquellen-Plugin bietet die folgenden Abfragetypen für Vorlagenvariablen.",
+ "tooltip-series-query": "Geben Sie eine Metrik mit Labels ein, nur eine Metrik oder nur Labels, z. B. {{example1}}, {{example2}} oder {{example3}}. Gibt eine Liste der Zeitreihen zurück, die den eingegebenen Daten zugeordnet sind."
},
"selector-actions": {
- "aria-label-selector": "",
- "aria-label-selector-clear-button": "",
- "aria-label-use-selector-as-metrics-button": "",
- "aria-label-use-selector-for-query-button": "",
- "aria-label-validate-submit-button": "",
+ "aria-label-selector": "Selektor",
+ "aria-label-selector-clear-button": "Löschen-Schaltfläche des Selektors",
+ "aria-label-use-selector-as-metrics-button": "Schaltfläche zur Verwendung des Selektors als Metrik",
+ "aria-label-use-selector-for-query-button": "Schaltfläche zur Verwendung des Selektors für die Abfrage",
+ "aria-label-validate-submit-button": "Validieren und Absenden-Schaltfläche",
"clear": "Löschen",
- "resulting-selector": "",
- "use-as-rate-query": "",
- "use-query": "",
- "validate-selector": ""
+ "resulting-selector": "4. Resultierender Selektor",
+ "use-as-rate-query": "Als Bewertungsabfrage verwenden",
+ "use-query": "Abfrage verwenden",
+ "validate-selector": "Selektor validieren"
},
"value-selector": {
- "aria-label-filter-expression-for-label-values": "",
- "aria-label-values-for": "",
- "description-search-field-values-across-selected-labels": "",
- "select-multiple-values-for-your-labels": ""
+ "aria-label-filter-expression-for-label-values": "Filterausdruck für Label-Werte",
+ "aria-label-values-for": "Werte für {{labelKey}}",
+ "description-search-field-values-across-selected-labels": "Verwenden Sie das Suchfeld, um Werte über mehrere ausgewählte Labels zu finden.",
+ "select-multiple-values-for-your-labels": "3. Wählen Sie (mehrere) Werte für Ihre Labels aus"
}
},
"configuration": {
"alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "",
- "label-manage-alerts-via-alerting-ui": "",
+ "label-allow-as-recording-rules-target": "Als Ziel für Aufnahmeregeln zulassen",
+ "label-manage-alerts-via-alerting-ui": "Benachrichtigungen über Alerting-UI verwalten",
"title-alerting": "Meldungen",
- "tooltip-allow-as-recording-rules-target": "",
+ "tooltip-allow-as-recording-rules-target": "Erlauben, dass diese Datenquelle als Ziel für das Schreiben von Aufnahmeregeln ausgewählt wird.",
"tooltip-manage-alerts-via-alerting-ui": "Verwalten Sie Warnregeln für diese Datenquelle. Fügen Sie eine Altermanager-Datenquelle hinzu, um andere Warnressourcen zu verwalten."
},
"config-editor": {
- "browser-access-mode-error": "",
- "description-advanced-settings": "",
+ "browser-access-mode-error": "Der Browserzugriffsmodus in der Prometheus-Datenquelle ist nicht mehr verfügbar. Wechseln Sie in den Serverzugriffsmodus.",
+ "description-advanced-settings": "Zusätzliche Einstellungen sind optionale Einstellungen, die für mehr Kontrolle über Ihre Datenquelle konfiguriert werden können.",
"title-advanced-settings": "Erweiterte Einstellungen",
"title-error": "Fehler"
},
"data-source-http-settings-overhaul": {
"tooltip-browser-access-mode": "Ihre Zugriffsmethode ist <1>Browser1>, d. h. die URL muss über den Browser zugänglich sein.",
- "tooltip-http-url": "",
+ "tooltip-http-url": "Geben Sie eine vollständige HTTP-URL an (z. B. {{exampleURL}})",
"tooltip-server-access-mode": "Ihre Zugriffsmethode ist <1>Server1>, d. h. die URL muss über das Grafana-Backend/den Grafana-Server zugänglich sein."
},
"docs-tip": {
- "visit-docs-for-more-details-here": ""
+ "visit-docs-for-more-details-here": "Weitere Details finden Sie hier in der Dokumentation."
},
"exemplar-setting": {
"label-data-source": "Datenquelle",
- "label-internal-link": "",
+ "label-internal-link": "Interner Link",
"label-label-name": "Label-Name",
- "label-remove-exemplar-link": "",
+ "label-remove-exemplar-link": "Exemplar-Link entfernen",
"label-url": "URL",
- "label-url-label": "",
- "placeholder-go-to-examplecom": "",
- "placeholder-httpsexamplecomvalueraw": "",
- "placeholder-trace-id": "",
- "title-remove-exemplar-link": "",
- "tooltip-data-source": "",
- "tooltip-internal-link": "",
- "tooltip-label-name": "",
- "tooltip-url": "",
- "tooltip-url-label": ""
+ "label-url-label": "URL-Label",
+ "placeholder-go-to-examplecom": "Zu example.com",
+ "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
+ "placeholder-trace-id": "traceID",
+ "title-remove-exemplar-link": "Exemplar-Link entfernen",
+ "tooltip-data-source": "Die Datenquelle, zu der das Exemplar navigiert.",
+ "tooltip-internal-link": "Aktivieren Sie diese Option, wenn Sie einen internen Link haben. Wenn dies aktiviert ist, wird der Datenquellen-Selektor angezeigt. Wählen Sie den Backend-Tracing-Datenspeicher für Ihre Exemplar-Daten aus.",
+ "tooltip-label-name": "Der Name des Felds im Label-Objekt, das für den Erhalt der TraceID verwendet werden soll.",
+ "tooltip-url": "Die URL des Trace-Backends, die der Nutzer zur Ansicht des Trace aufrufen würde",
+ "tooltip-url-label": "Damit können Sie das Schaltflächen-Label im Feld der Exemplar-TraceID überschreiben."
},
"exemplars-settings": {
"add": "Hinzufügen",
- "no-exemplars-configurations": "",
- "title-exemplars": ""
+ "no-exemplars-configurations": "Keine Exemplar-Konfigurationen",
+ "title-exemplars": "Exemplare"
},
"prom-settings": {
- "aria-label-default-editor": "",
- "aria-label-prom-type-type": "",
- "aria-label-prometheus-type": "",
- "aria-label-select-http-method": "",
+ "aria-label-default-editor": "Standard-Editor (Code oder Builder)",
+ "aria-label-prom-type-type": "{{promType}} Typ",
+ "aria-label-prometheus-type": "Prometheus-Typ",
+ "aria-label-select-http-method": "HTTP-Methode auswählen",
"editor-options": {
"label-builder": "",
"label-code": ""
},
- "label-cache-level": "",
- "label-custom-query-parameters": "",
- "label-default-editor": "",
- "label-disable-metrics-lookup": "",
- "label-disable-recording-rules-beta": "",
- "label-http-method": "",
- "label-incremental-querying-beta": "",
- "label-metric-names-suggestion-limit": "",
- "label-prom-type-version": "",
- "label-prometheus-type": "",
- "label-query-overlap-window": "",
- "label-query-timeout": "",
- "label-scrape-interval": "",
- "label-series-limit": "",
- "label-use-series-endpoint": "",
- "more-info": "",
- "placeholder-example-maxsourceresolutionmtimeout": "",
- "title-interval-behaviour": "",
- "title-other": "",
+ "label-cache-level": "Cache-Level",
+ "label-custom-query-parameters": "Benutzerdefinierte Abfrageparameter",
+ "label-default-editor": "Standard-Editor",
+ "label-disable-metrics-lookup": "Metrik-Suche deaktivieren",
+ "label-disable-recording-rules-beta": "Aufnahmeregeln deaktivieren (Beta)",
+ "label-http-method": "HTTP-Methode",
+ "label-incremental-querying-beta": "Inkrementelle Abfrage (Beta)",
+ "label-metric-names-suggestion-limit": "Begrenzung der Vorschläge für Metriknamen",
+ "label-prom-type-version": "{{promType}} Version",
+ "label-prometheus-type": "Prometheus-Typ",
+ "label-query-overlap-window": "Fenster der Abfrage-Überschneidung",
+ "label-query-timeout": "Abfrage-Timeout",
+ "label-scrape-interval": "Scrape-Intervall",
+ "label-series-limit": "Reihengrenze",
+ "label-use-series-endpoint": "Reihenendpunkt verwenden",
+ "more-info": "Weitere Informationen zur Konfiguration des Typs und der Version von Prometheus in Datenquellen finden Sie in der <2>Bereitstellungsdokumentation2>.",
+ "placeholder-example-maxsourceresolutionmtimeout": "Beispiel: {{example}}",
+ "title-interval-behaviour": "Intervallverhalten",
+ "title-other": "Sonstiges",
"title-performance": "Leistung",
- "title-query-editor": "",
- "tooltip-cache-level": "",
- "tooltip-custom-query-parameters": "",
- "tooltip-default-editor": "",
- "tooltip-disable-metrics-lookup": "",
- "tooltip-disable-recording-rules-beta": "",
- "tooltip-http-method": "",
- "tooltip-incremental-querying-beta": "",
- "tooltip-metric-names-suggestion-limit": "",
- "tooltip-prom-type-version": "",
- "tooltip-prometheus-type": "",
- "tooltip-query-overlap-window": "",
- "tooltip-query-timeout": "",
- "tooltip-scrape-interval": "",
- "tooltip-series-limit": "",
- "tooltip-use-series-endpoint": ""
+ "title-query-editor": "Abfrage-Editor",
+ "tooltip-cache-level": "Legt die Browser-Cache-Level für Editor-Abfragen fest. Für Datenquellen mit hoher Kardinalität werden höhere Cache-Einstellungen empfohlen.",
+ "tooltip-custom-query-parameters": "Fügen Sie der URL der Prometheus-Abfrage benutzerdefinierte Parameter hinzu. Zum Beispiel {{example1}}, {{example2}}, {{example3}} oder {{example4}}. Mehrere Parameter sollten mit {{concatenationChar}} verknüpft werden.",
+ "tooltip-default-editor": "Legen Sie die Standard-Editoroption für alle Nutzer dieser Datenquelle fest.",
+ "tooltip-disable-metrics-lookup": "Wenn diese Option aktiviert ist, werden die Metrikauswahl und die Unterstützung für Metriken/Labels im Rahmen der Autovervollständigung des Abfragefelds deaktiviert. Dies hilft, wenn Sie Leistungsprobleme mit größeren Prometheus-Instanzen haben. ",
+ "tooltip-disable-recording-rules-beta": "Diese Funktion deaktiviert die Aufnahmeregeln. Wenn Sie dies aktivieren, wird die Dashboard-Leistung verbessert",
+ "tooltip-http-method": "Sie können entweder die HTTP-Methode POST oder GET für die Abfrage Ihrer Prometheus-Datenquelle verwenden. POST ist die empfohlene Methode, da sie größere Abfragen ermöglicht. Ändern Sie dies zu GET, wenn Ihre Prometheus-Version älter als 2.1 ist oder POST-Abfragen in Ihrem Netzwerk beschränkt sind.",
+ "tooltip-incremental-querying-beta": "Diese Funktion ändert das Standardverhalten von relativen Abfragen, sodass immer neue Daten von der Prometheus-Instanz abgefragt werden. Stattdessen werden Abfrageergebnisse zwischengespeichert und nur neue Datensätze abgefragt. Wenn Sie dies aktivieren, wird die Datenbank- und Netzwerklast reduziert.",
+ "tooltip-metric-names-suggestion-limit": "Die maximale Anzahl an Metriknamen, die im Code-Modus des Abfrage-Editors als Vorschläge im Rahmen der Autovervollständigung angezeigt werden können.",
+ "tooltip-prom-type-version": "Nutzen Sie diese Option, um die Version Ihrer Instanz von {{promType}} festzulegen, wenn sie nicht automatisch konfiguriert wird.",
+ "tooltip-prometheus-type": "Stellen Sie dies auf den Typ Ihrer Prometheus-Datenbank ein, z. B. Prometheus, Cortex, Mimir oder Thanos. Wenn Sie dieses Feld ändern, werden Ihre aktuellen Einstellungen gespeichert. Bestimmte Typen von Prometheus unterstützen entweder verschiedene APIs oder nicht. Zum Beispiel unterstützen manche Typen Regex-Matching für Label-Abfragen, um die Leistung zu verbessern. Manche Typen haben eine API für Metadaten. Wenn Sie dies falsch einstellen, kann es bei der Abfrage von Metriken und Labels zu einem ungewöhnlichen Verhalten kommen. Bitte prüfen Sie Ihre Prometheus-Dokumentation, um sicherzugehen, dass Sie den richtigen Typ eingeben.",
+ "tooltip-query-overlap-window": "Stellen Sie eine Dauer ein, zum Beispiel {{example1}} oder {{example2}} oder {{example3}}. Standardwert: {{default}}. Diese Dauer wird zur Dauer jeder inkrementellen Abfrage hinzugefügt.",
+ "tooltip-query-timeout": "Legen Sie das Prometheus-Abfrage-Timeout fest.",
+ "tooltip-scrape-interval": "Dieses Intervall gibt an, wie oft Prometheus ein Scraping für Ziele durchführt. Stellen Sie dies auf das typische Scrape- und Bewertungsintervall ein, das in Ihrer Prometheus-Konfigurationsdatei konfiguriert ist. Wenn Sie dies auf einen größeren Wert als das Intervall Ihrer Prometheus-Konfigurationsdatei einstellen, wertet Grafana die Daten gemäß diesem Intervall aus und Sie sehen weniger Datenpunkte. Standardmäßig {{default}}.",
+ "tooltip-series-limit": "Die Grenze gilt für alle Ressourcen (Metriken, Labels und Werte) für beide Endpunkte (Reihen und Labels). Wenn Sie das Feld leer lassen, wird die Standardgrenze verwendet (40.000). Durch eine Einstellung auf 0 wird die Grenze deaktiviert und alles abgerufen – dies kann zu Leistungsproblemen führen. Die Standardgrenze beträgt 40.000.",
+ "tooltip-use-series-endpoint": "Wenn diese Option aktiviert ist, wird der Reihenendpunkt mit dem Parameter {{exampleParameter}} gegenüber dem Endpunkt der Label-Werte mit dem Parameter {{exampleParameter}} bevorzugt. Obwohl der Endpunkt der Label-Werte als leistungsfähiger gilt, könnten manche Nutzer die Reihe bevorzugen, da sie über eine POST-Methode verfügt, während der Endpunkt der Label-Werte nur über eine GET-Methode verfügt."
}
},
"prom-query-legend-editor": {
@@ -209,14 +209,111 @@
"label-verbose": ""
}
},
+ "promql": {
+ "getAggregationOptions": {
+ "documentation-avg": "",
+ "documentation-bottomk": "",
+ "documentation-count": "",
+ "documentation-count-values": "",
+ "documentation-group": "",
+ "documentation-max": "",
+ "documentation-min": "",
+ "documentation-quantile": "",
+ "documentation-stddev": "",
+ "documentation-stdvar": "",
+ "documentation-sum": "",
+ "documentation-topk": ""
+ },
+ "getFunctions": {
+ "documentation-abs": "",
+ "documentation-absent": "",
+ "documentation-absent-over-time": "",
+ "documentation-avg-over-time": "",
+ "documentation-ceil": "",
+ "documentation-changes": "",
+ "documentation-clamp": "",
+ "documentation-clamp-max": "",
+ "documentation-clamp-min": "",
+ "documentation-count-over-time": "",
+ "documentation-count-scalar": "",
+ "documentation-day-of-month": "",
+ "documentation-day-of-week": "",
+ "documentation-day-of-year": "",
+ "documentation-days-in-month": "",
+ "documentation-deg": "",
+ "documentation-delta": "",
+ "documentation-deriv": "",
+ "documentation-double-exponential-smoothing": "",
+ "documentation-drop-common-labels": "",
+ "documentation-exp": "",
+ "documentation-floor": "",
+ "documentation-histogram-avg": "",
+ "documentation-histogram-count": "",
+ "documentation-histogram-fraction": "",
+ "documentation-histogram-quantile": "",
+ "documentation-histogram-stddev": "",
+ "documentation-histogram-stdvar": "",
+ "documentation-histogram-sum": "",
+ "documentation-holt-winters": "",
+ "documentation-hour": "",
+ "documentation-idelta": "",
+ "documentation-increase": "",
+ "documentation-info": "",
+ "documentation-irate": "",
+ "documentation-label-join": "",
+ "documentation-label-replace": "",
+ "documentation-last-over-time": "",
+ "documentation-ln": "",
+ "documentation-log10": "",
+ "documentation-log2": "",
+ "documentation-max-over-time": "",
+ "documentation-min-over-time": "",
+ "documentation-minute": "",
+ "documentation-month": "",
+ "documentation-pi": "",
+ "documentation-predict-linear": "",
+ "documentation-present-over-time": "",
+ "documentation-quantile-over-time": "",
+ "documentation-rad": "",
+ "documentation-rate": "",
+ "documentation-resets": "",
+ "documentation-round": "",
+ "documentation-scalar": "",
+ "documentation-sgn": "",
+ "documentation-sort": "",
+ "documentation-sort-desc": "",
+ "documentation-sqrt": "",
+ "documentation-stddev-over-time": "",
+ "documentation-stdvar-over-time": "",
+ "documentation-sum-over-time": "",
+ "documentation-time": "",
+ "documentation-timestamp": "",
+ "documentation-vector": "",
+ "documentation-year": ""
+ },
+ "getTrigonometricFunctions": {
+ "documentation-acos": "",
+ "documentation-acosh": "",
+ "documentation-asin": "",
+ "documentation-asinh": "",
+ "documentation-atan": "",
+ "documentation-atanh": "",
+ "documentation-cos": "",
+ "documentation-cosh": "",
+ "documentation-sin": "",
+ "documentation-sinh": "",
+ "documentation-tan": "",
+ "documentation-tanh": ""
+ }
+ },
"querybuilder": {
"additional-settings": {
- "content-filter-metric-names-regex-search-using": "",
- "disable-text-wrap": ""
+ "content-filter-metric-names-regex-search-using": "Filtern Sie Metriknamen per Regex-Suche und nutzen Sie dabei einen zusätzlichen Aufruf der Prometheus-API.",
+ "disable-text-wrap": "Textumbruch deaktivieren"
},
"feedback-link": {
"give-feedback": "Feedback geben",
- "title-give-feedback": ""
+ "title-give-feedback": "Der Metrik-Explorer ist neu. Bitte teilen Sie uns mit, wie wir ihn verbessern können."
},
"get-collapsed-info": {
"exemplars": "",
@@ -250,18 +347,18 @@
},
"handle-function": {
"text": {
- "query-parsing-is-ambiguous": ""
+ "query-parsing-is-ambiguous": "Das Abfrage-Parsing ist unklar."
}
},
"label-filter-item": {
- "aria-label-remove": "",
- "placeholder-select-label": "",
+ "aria-label-remove": "Entfernen von {{name}}",
+ "placeholder-select-label": "Label auswählen",
"placeholder-select-value": "Wert auswählen"
},
"label-filters": {
- "label-filters": "",
- "label-label-filters": "",
- "tooltip-label-filters": ""
+ "label-filters": "Label-Filter",
+ "label-label-filters": "Label-Filter",
+ "tooltip-label-filters": "Optional: wird verwendet, um die Metrikauswahl für diesen Abfragetyp zu filtern."
},
"label-param-editor": {
"loadingMessage-loading-labels": "",
@@ -269,92 +366,99 @@
},
"metric-combobox": {
"async-select": {
- "aria-label-open-metrics-explorer": "",
- "placeholder-select-metric": "",
- "tooltip-open-metrics-explorer": ""
+ "aria-label-open-metrics-explorer": "Metrik-Explorer öffnen",
+ "placeholder-select-metric": "Metrik auswählen",
+ "tooltip-open-metrics-explorer": "Metrik-Explorer öffnen"
},
"label-metric": "Metrik",
- "tooltip-metric": ""
+ "tooltip-metric": "Optional: gibt eine Liste von Label-Werten für den Label-Namen in der angegebenen Metrik zurück."
},
"metrics-modal": {
- "additional-settings": "",
+ "additional-settings": "Zusätzliche Einstellungen",
"aria-label-additional-settings": "Zusätzliche Einstellungen",
- "aria-label-browse-metrics": "",
- "currently-selected": "",
- "metrics-pre-filtered": "",
- "placeholder-results-per-page": "",
- "results-per-page": "",
- "title-metrics-explorer": "",
- "results-amount_one": "",
- "results-amount_other": ""
+ "aria-label-browse-metrics": "Metriken durchsuchen",
+ "currently-selected": "Aktuell ausgewählt: {{selected}}",
+ "metrics-pre-filtered": "Diese Metriken wurden anhand der Labels, die in den Label-Filtern ausgewählt wurden, vorgefiltert.",
+ "placeholder-results-per-page": "Ergebnisse pro Seite",
+ "results-per-page": "Ergebnisse pro Seite",
+ "title-metrics-explorer": "Metrik-Explorer",
+ "results-amount_one": "{{num}} von {{count}} Ergebnissen werden angezeigt",
+ "results-amount_other": "{{num}} von {{count}} Ergebnissen werden angezeigt"
},
"nested-query": {
"label": {
- "ignoring": "",
+ "ignoring": "Ignorieren",
"on": "Aktiviert"
},
"operator": "Bediener",
- "tooltip-remove-match": "",
- "vector-matches": ""
+ "tooltip-remove-match": "Übereinstimmung entfernen",
+ "vector-matches": "Vektorübereinstimmungen"
},
"operation-editor": {
- "not-found": "",
- "title-remove": ""
+ "not-found": "Vorgang {{id}} nicht gefunden",
+ "title-remove": "Entfernen von {{name}}"
},
"operation-header": {
"placeholder-replace-with": "Ersetzen mit",
- "title-click-to-view-alternative-operations": "",
- "title-remove-operation": ""
+ "title-click-to-view-alternative-operations": "Klicken Sie zur Anzeige alternativer Vorgänge",
+ "title-remove-operation": "Vorgang entfernen"
},
"operation-info-button": {
- "title-click-to-show-description": "",
- "title-remove-operation": ""
+ "title-click-to-show-description": "Klicken Sie zur Ansicht der Beschreibung",
+ "title-remove-operation": "Operation entfernen"
},
"operation-list": {
- "operations": "",
+ "operations": "Vorgänge",
"placeholder-search": "Suche",
- "title-add-operation": ""
+ "title-add-operation": "Vorgang hinzufügen"
},
"operation-param-editor": {
- "title-add": "",
- "title-remove": ""
+ "title-add": "{{name}} hinzufügen",
+ "title-remove": "{{name}} entfernen"
+ },
+ "operation-utils": {
+ "getAggregationExplainer": {
+ "label-by": "",
+ "label-default": "",
+ "label-without": ""
+ }
},
"prom-query-builder-options": {
- "aria-label-lower-limit-parameter": "",
- "aria-label-select-resolution": "",
+ "aria-label-lower-limit-parameter": "Untergrenze für den Schrittparameter festlegen",
+ "aria-label-select-resolution": "Auflösung auswählen",
"format-options": {
"label-heatmap": "",
"label-table": "",
"label-time-series": ""
},
- "label-exemplars": "",
+ "label-exemplars": "Exemplare",
"label-format": "Format",
- "label-min-step": "",
- "label-resolution": "",
+ "label-min-step": "Min. Schritt",
+ "label-resolution": "Auflösung",
"label-type": "Typ",
- "placeholder-auto": "",
+ "placeholder-auto": "Auto",
"title-options": "Optionen",
- "tooltip-min-step": ""
+ "tooltip-min-step": "Eine zusätzliche Untergrenze für den Schrittparameter der Prometheus-Abfrage und für die Variablen <2>{{interval}}2> und <4>{{rateInterval}}4>."
},
"prom-query-code-editor-autocomplete-info": {
- "autocomplete-suggestions-limited": "",
- "tooltip-autocomplete-suggestions-limited": ""
+ "autocomplete-suggestions-limited": "Vorschläge der Autovervollständigung begrenzt",
+ "tooltip-autocomplete-suggestions-limited": "Die Anzahl der Metriknamen überschreitet die Grenze der Autovervollständigung. Es werden nur die für {{autocompleteLimit}} relevantesten Metriken angezeigt. Sie können die Grenze in den Datenquelleneinstellungen anpassen."
},
"prom-query-editor-selector": {
"body-syntax-error": "",
"confirmText-continue": "",
"kick-start-your-query": "Starten Sie Ihre Abfrage",
- "label-explain": "",
- "run-queries": "",
- "title-parsing-error-switch-builder": ""
+ "label-explain": "Erklären",
+ "run-queries": "Abfragen ausführen",
+ "title-parsing-error-switch-builder": "Parsing-Fehler: In den Builder-Modus wechseln?"
},
"prom-query-legend-editor": {
- "label-legend": "",
- "placeholder-select-legend-mode": "",
- "tooltip-legend": ""
+ "label-legend": "Legende",
+ "placeholder-select-legend-mode": "Legendenmodus auswählen",
+ "tooltip-legend": "Überschreibung des Reihennamens oder Vorlage. Beispiel: {{templateExample}} wird durch den Label-Wert für {{labelName}} ersetzt."
},
"query-builder-hints": {
- "hint-details": ""
+ "hint-details": "Hinweis: {{hintDetails}}"
},
"query-editor-mode-toggle": {
"editor-modes": {
@@ -363,30 +467,30 @@
}
},
"query-pattern": {
- "apply-query": "",
- "aria-label-apply-query-starter-button": "",
- "aria-label-back-button": "",
- "aria-label-create-new-query-button": "",
- "aria-label-raw-query": "",
- "aria-label-use-this-query-button": "",
+ "apply-query": "Abfrage anwenden",
+ "aria-label-apply-query-starter-button": "Schaltfläche zur Anwendung des Abfrage-Starters",
+ "aria-label-back-button": "Zurück-Schaltfläche",
+ "aria-label-create-new-query-button": "Schaltfläche zur Erstellung einer neuen Abfrage",
+ "aria-label-raw-query": "{{patternName}} Rohabfrage",
+ "aria-label-use-this-query-button": "Schaltfläche zum Nutzen dieser Abfrage",
"back": "Zurück",
- "create-new-query": "",
+ "create-new-query": "Neue Abfrage erstellen",
"use-this-query": "Diese Abfrage nutzen"
},
"query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "",
+ "aria-label-close-kick-start-your-query-modal": "Modal zum Starten Ihrer Abfrage schließen",
"aria-label-kick-start-your-query-modal": "Starten Sie Ihr Abfrage-Modal",
- "aria-label-toggle-query-starter": "",
+ "aria-label-toggle-query-starter": "Öffnen und Schließen der {{patternType}} Abfrage-Starter-Karte",
"close": "Schließen",
- "description-kick-start-your-query": "",
- "label-toggle-query-starter": "",
+ "description-kick-start-your-query": "Starten Sie Ihre Abfrage, indem Sie eine dieser Abfragen auswählen. Sie können dann mit dem Abschluss Ihrer Abfrage fortfahren.",
+ "label-toggle-query-starter": "{{patternType}} Abfrage-Starter",
"title-kick-start-your-query": "Starten Sie Ihre Abfrage"
},
"raw-query": {
- "aria-label-selector": ""
+ "aria-label-selector": "Selektor"
},
"results-table": {
- "content-descriptive-type": "",
+ "content-descriptive-type": "Bei der Erstellung von {{descriptiveType}} zeigt Prometheus mehrere Reihen mit dem Typ Counter. ",
"description": "Beschreibung",
"message-expand-label-filters": "",
"message-expand-search": "",
@@ -397,7 +501,7 @@
},
"update-function-args": {
"text": {
- "query-parsing-is-ambiguous": ""
+ "query-parsing-is-ambiguous": "Das Abfrage-Parsing ist unklar."
}
}
}
diff --git a/packages/grafana-prometheus/src/locales/en-US/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/en-US/grafana-prometheus.json
index 26fecb50168..85eba24f8a4 100644
--- a/packages/grafana-prometheus/src/locales/en-US/grafana-prometheus.json
+++ b/packages/grafana-prometheus/src/locales/en-US/grafana-prometheus.json
@@ -209,6 +209,103 @@
"label-verbose": "Verbose"
}
},
+ "promql": {
+ "getAggregationOptions": {
+ "documentation-avg": "Calculate the average over dimensions",
+ "documentation-bottomk": "Smallest k elements by sample value",
+ "documentation-count": "Count number of elements in the vector",
+ "documentation-count-values": "Count number of elements with the same value",
+ "documentation-group": "All values in the resulting vector are 1",
+ "documentation-max": "Select maximum over dimensions",
+ "documentation-min": "Select minimum over dimensions",
+ "documentation-quantile": "Calculate φ-quantile (0 ≤ φ ≤ 1) over dimensions",
+ "documentation-stddev": "Calculate population standard deviation over dimensions",
+ "documentation-stdvar": "Calculate population standard variance over dimensions",
+ "documentation-sum": "Calculate sum over dimensions",
+ "documentation-topk": "Largest k elements by sample value"
+ },
+ "getFunctions": {
+ "documentation-abs": "Returns the input vector with all sample values converted to their absolute value.",
+ "documentation-absent": "Returns an empty vector if the vector passed to it has any elements and a 1-element vector with the value 1 if the vector passed to it has no elements. This is useful for alerting on when no time series exist for a given metric name and label combination.",
+ "documentation-absent-over-time": "Returns an empty vector if the range vector passed to it has any elements and a 1-element vector with the value 1 if the range vector passed to it has no elements.",
+ "documentation-avg-over-time": "The average value of all points in the specified interval.",
+ "documentation-ceil": "Rounds the sample values of all elements in `v` up to the nearest integer.",
+ "documentation-changes": "For each input time series, `changes(v range-vector)` returns the number of times its value has changed within the provided time range as an instant vector.",
+ "documentation-clamp": "Clamps the sample values of all elements in `v` to have a lower limit of `min` and an upper limit of `max`.",
+ "documentation-clamp-max": "Clamps the sample values of all elements in `v` to have an upper limit of `max`.",
+ "documentation-clamp-min": "Clamps the sample values of all elements in `v` to have a lower limit of `min`.",
+ "documentation-count-over-time": "The count of all values in the specified interval.",
+ "documentation-count-scalar": "Returns the number of elements in a time series vector as a scalar. This is in contrast to the `count()` aggregation operator, which always returns a vector (an empty one if the input vector is empty) and allows grouping by labels via a `by` clause.",
+ "documentation-day-of-month": "Returns the day of the month for each of the given times in UTC. Returned values are from 1 to 31.",
+ "documentation-day-of-week": "Returns the day of the week for each of the given times in UTC. Returned values are from 0 to 6, where 0 means Sunday etc.",
+ "documentation-day-of-year": "Returns the day of the year for each of the given times in UTC. Returned values are from 1 to 365 for non-leap years, and 1 to 366 in leap years.",
+ "documentation-days-in-month": "Returns number of days in the month for each of the given times in UTC. Returned values are from 28 to 31.",
+ "documentation-deg": "Converts radians to degrees for all elements in v",
+ "documentation-delta": "Calculates the difference between the first and last value of each time series element in a range vector `v`, returning an instant vector with the given deltas and equivalent labels. The delta is extrapolated to cover the full time range as specified in the range vector selector, so that it is possible to get a non-integer result even if the sample values are all integers.",
+ "documentation-deriv": "Calculates the per-second derivative of the time series in a range vector `v`, using simple linear regression.",
+ "documentation-double-exponential-smoothing": "Produces a smoothed value for time series based on the range in `v`. The lower the smoothing factor `sf`, the more importance is given to old data. The higher the trend factor `tf`, the more trends in the data is considered. Both `sf` and `tf` must be between 0 and 1.",
+ "documentation-drop-common-labels": "Drops all labels that have the same name and value across all series in the input vector.",
+ "documentation-exp": "Calculates the exponential function for all elements in `v`.\nSpecial cases are:\n* `Exp(+Inf) = +Inf` \n* `Exp(NaN) = NaN`",
+ "documentation-floor": "Rounds the sample values of all elements in `v` down to the nearest integer.",
+ "documentation-histogram-avg": "Returns the arithmetic average of observed values stored in a native histogram. Samples that are not native histograms are ignored and do not show up in the returned vector.",
+ "documentation-histogram-count": "Returns the count of observations stored in a native histogram.",
+ "documentation-histogram-fraction": "Returns the estimated fraction of observations between the provided lower and upper values.",
+ "documentation-histogram-quantile": "Calculates the φ-quantile (0 ≤ φ ≤ 1) from the buckets `b` of a histogram. The samples in `b` are the counts of observations in each bucket. Each sample must have a label `le` where the label value denotes the inclusive upper bound of the bucket. (Samples without such a label are silently ignored.) The histogram metric type automatically provides time series with the `_bucket` suffix and the appropriate labels.",
+ "documentation-histogram-stddev": "Returns the estimated standard deviation of observations in a native histogram, based on the geometric mean of the buckets where the observations lie.",
+ "documentation-histogram-stdvar": "Returns the estimated standard variance of observations in a native histogram.",
+ "documentation-histogram-sum": "Returns the sum of observations stored in a native histogram.",
+ "documentation-holt-winters": "Renamed as double_exponential_smoothing in prometheus v3.x. For prometheus versions equal and greater than v3.0 please use double_exponential_smoothing. \n\nProduces a smoothed value for time series based on the range in `v`. The lower the smoothing factor `sf`, the more importance is given to old data. The higher the trend factor `tf`, the more trends in the data is considered. Both `sf` and `tf` must be between 0 and 1.",
+ "documentation-hour": "Returns the hour of the day for each of the given times in UTC. Returned values are from 0 to 23.",
+ "documentation-idelta": "Calculates the difference between the last two samples in the range vector `v`, returning an instant vector with the given deltas and equivalent labels.",
+ "documentation-increase": "Calculates the increase in the time series in the range vector. Breaks in monotonicity (such as counter resets due to target restarts) are automatically adjusted for. The increase is extrapolated to cover the full time range as specified in the range vector selector, so that it is possible to get a non-integer result even if a counter increases only by integer increments.",
+ "documentation-info": "Returns latest details and metadata about a group of metrics, such as their labels and current values, without doing any calculations",
+ "documentation-irate": "Calculates the per-second instant rate of increase of the time series in the range vector. This is based on the last two data points. Breaks in monotonicity (such as counter resets due to target restarts) are automatically adjusted for.",
+ "documentation-label-join": "For each timeseries in `v`, joins all the values of all the `src_labels` using `separator` and returns the timeseries with the label `dst_label` containing the joined value. There can be any number of `src_labels` in this function.",
+ "documentation-label-replace": "For each timeseries in `v`, `label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)` matches the regular expression `regex` against the label `src_label`. If it matches, then the timeseries is returned with the label `dst_label` replaced by the expansion of `replacement`. `$1` is replaced with the first matching subgroup, `$2` with the second etc. If the regular expression doesn't match then the timeseries is returned unchanged.",
+ "documentation-last-over-time": "The most recent point value in specified interval.",
+ "documentation-ln": "Calculates the natural logarithm for all elements in `v`.\nSpecial cases are:\n * `ln(+Inf) = +Inf`\n * `ln(0) = -Inf`\n * `ln(x < 0) = NaN`\n * `ln(NaN) = NaN`",
+ "documentation-log10": "Calculates the decimal logarithm for all elements in `v`. The special cases are equivalent to those in `ln`.",
+ "documentation-log2": "Calculates the binary logarithm for all elements in `v`. The special cases are equivalent to those in `ln`.",
+ "documentation-max-over-time": "The maximum value of all points in the specified interval.",
+ "documentation-min-over-time": "The minimum value of all points in the specified interval.",
+ "documentation-minute": "Returns the minute of the hour for each of the given times in UTC. Returned values are from 0 to 59.",
+ "documentation-month": "Returns the month of the year for each of the given times in UTC. Returned values are from 1 to 12, where 1 means January etc.",
+ "documentation-pi": "Returns pi",
+ "documentation-predict-linear": "Predicts the value of time series `t` seconds from now, based on the range vector `v`, using simple linear regression.",
+ "documentation-present-over-time": "The value 1 for any series in the specified interval.",
+ "documentation-quantile-over-time": "The φ-quantile (0 ≤ φ ≤ 1) of the values in the specified interval.",
+ "documentation-rad": "Converts degrees to radians for all elements in v",
+ "documentation-rate": "Calculates the per-second average rate of increase of the time series in the range vector. Breaks in monotonicity (such as counter resets due to target restarts) are automatically adjusted for. Also, the calculation extrapolates to the ends of the time range, allowing for missed scrapes or imperfect alignment of scrape cycles with the range's time period.",
+ "documentation-resets": "For each input time series, `resets(v range-vector)` returns the number of counter resets within the provided time range as an instant vector. Any decrease in the value between two consecutive samples is interpreted as a counter reset.",
+ "documentation-round": "Rounds the sample values of all elements in `v` to the nearest integer. Ties are resolved by rounding up. The optional `to_nearest` argument allows specifying the nearest multiple to which the sample values should be rounded. This multiple may also be a fraction.",
+ "documentation-scalar": "Given a single-element input vector, `scalar(v instant-vector)` returns the sample value of that single element as a scalar. If the input vector does not have exactly one element, `scalar` will return `NaN`.",
+ "documentation-sgn": "Returns a vector with all sample values converted to their sign, defined as this: 1 if v is positive, -1 if v is negative and 0 if v is equal to zero.",
+ "documentation-sort": "Returns vector elements sorted by their sample values, in ascending order.",
+ "documentation-sort-desc": "Returns vector elements sorted by their sample values, in descending order.",
+ "documentation-sqrt": "Calculates the square root of all elements in `v`.",
+ "documentation-stddev-over-time": "The population standard deviation of the values in the specified interval.",
+ "documentation-stdvar-over-time": "The population standard variance of the values in the specified interval.",
+ "documentation-sum-over-time": "The sum of all values in the specified interval.",
+ "documentation-time": "Returns the number of seconds since January 1, 1970 UTC. Note that this does not actually return the current time, but the time at which the expression is to be evaluated.",
+ "documentation-timestamp": "Returns the timestamp of each of the samples of the given vector as the number of seconds since January 1, 1970 UTC.",
+ "documentation-vector": "Returns the scalar `s` as a vector with no labels.",
+ "documentation-year": "Returns the year for each of the given times in UTC."
+ },
+ "getTrigonometricFunctions": {
+ "documentation-acos": "calculates the arccosine of all elements in {{argument}}",
+ "documentation-acosh": "calculates the inverse hyperbolic cosine of all elements in {{argument}}",
+ "documentation-asin": "calculates the arcsine of all elements in {{argument}}",
+ "documentation-asinh": "calculates the inverse hyperbolic sine of all elements in {{argument}}",
+ "documentation-atan": "calculates the arctangent of all elements in {{argument}}",
+ "documentation-atanh": "calculates the inverse hyperbolic tangent of all elements in {{argument}}",
+ "documentation-cos": "calculates the cosine of all elements in {{argument}}",
+ "documentation-cosh": "calculates the hyperbolic cosine of all elements in {{argument}}",
+ "documentation-sin": "calculates the sine of all elements in {{argument}}",
+ "documentation-sinh": "calculates the hyperbolic sine of all elements in {{argument}}",
+ "documentation-tan": "calculates the tangent of all elements in {{argument}}",
+ "documentation-tanh": "calculates the hyperbolic tangent of all elements in {{argument}}"
+ }
+ },
"querybuilder": {
"additional-settings": {
"content-filter-metric-names-regex-search-using": "Filter metric names by regex search, using an additional call on the Prometheus API.",
@@ -319,6 +416,13 @@
"title-add": "Add {{name}}",
"title-remove": "Remove {{name}}"
},
+ "operation-utils": {
+ "getAggregationExplainer": {
+ "label-by": "Calculates {{aggregationName}} over dimensions while preserving {{labelWord}} {{labels}}.",
+ "label-default": "Calculates {{aggregationName}} over the dimensions.",
+ "label-without": "Calculates {{aggregationName}} over the dimensions {{labels}}. All other labels are preserved."
+ }
+ },
"prom-query-builder-options": {
"aria-label-lower-limit-parameter": "Set lower limit for the step parameter",
"aria-label-select-resolution": "Select resolution",
diff --git a/packages/grafana-prometheus/src/locales/es-ES/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/es-ES/grafana-prometheus.json
index d4ca0b7b366..fc668327cdb 100644
--- a/packages/grafana-prometheus/src/locales/es-ES/grafana-prometheus.json
+++ b/packages/grafana-prometheus/src/locales/es-ES/grafana-prometheus.json
@@ -209,6 +209,103 @@
"label-verbose": ""
}
},
+ "promql": {
+ "getAggregationOptions": {
+ "documentation-avg": "",
+ "documentation-bottomk": "",
+ "documentation-count": "",
+ "documentation-count-values": "",
+ "documentation-group": "",
+ "documentation-max": "",
+ "documentation-min": "",
+ "documentation-quantile": "",
+ "documentation-stddev": "",
+ "documentation-stdvar": "",
+ "documentation-sum": "",
+ "documentation-topk": ""
+ },
+ "getFunctions": {
+ "documentation-abs": "",
+ "documentation-absent": "",
+ "documentation-absent-over-time": "",
+ "documentation-avg-over-time": "",
+ "documentation-ceil": "",
+ "documentation-changes": "",
+ "documentation-clamp": "",
+ "documentation-clamp-max": "",
+ "documentation-clamp-min": "",
+ "documentation-count-over-time": "",
+ "documentation-count-scalar": "",
+ "documentation-day-of-month": "",
+ "documentation-day-of-week": "",
+ "documentation-day-of-year": "",
+ "documentation-days-in-month": "",
+ "documentation-deg": "",
+ "documentation-delta": "",
+ "documentation-deriv": "",
+ "documentation-double-exponential-smoothing": "",
+ "documentation-drop-common-labels": "",
+ "documentation-exp": "",
+ "documentation-floor": "",
+ "documentation-histogram-avg": "",
+ "documentation-histogram-count": "",
+ "documentation-histogram-fraction": "",
+ "documentation-histogram-quantile": "",
+ "documentation-histogram-stddev": "",
+ "documentation-histogram-stdvar": "",
+ "documentation-histogram-sum": "",
+ "documentation-holt-winters": "",
+ "documentation-hour": "",
+ "documentation-idelta": "",
+ "documentation-increase": "",
+ "documentation-info": "",
+ "documentation-irate": "",
+ "documentation-label-join": "",
+ "documentation-label-replace": "",
+ "documentation-last-over-time": "",
+ "documentation-ln": "",
+ "documentation-log10": "",
+ "documentation-log2": "",
+ "documentation-max-over-time": "",
+ "documentation-min-over-time": "",
+ "documentation-minute": "",
+ "documentation-month": "",
+ "documentation-pi": "",
+ "documentation-predict-linear": "",
+ "documentation-present-over-time": "",
+ "documentation-quantile-over-time": "",
+ "documentation-rad": "",
+ "documentation-rate": "",
+ "documentation-resets": "",
+ "documentation-round": "",
+ "documentation-scalar": "",
+ "documentation-sgn": "",
+ "documentation-sort": "",
+ "documentation-sort-desc": "",
+ "documentation-sqrt": "",
+ "documentation-stddev-over-time": "",
+ "documentation-stdvar-over-time": "",
+ "documentation-sum-over-time": "",
+ "documentation-time": "",
+ "documentation-timestamp": "",
+ "documentation-vector": "",
+ "documentation-year": ""
+ },
+ "getTrigonometricFunctions": {
+ "documentation-acos": "",
+ "documentation-acosh": "",
+ "documentation-asin": "",
+ "documentation-asinh": "",
+ "documentation-atan": "",
+ "documentation-atanh": "",
+ "documentation-cos": "",
+ "documentation-cosh": "",
+ "documentation-sin": "",
+ "documentation-sinh": "",
+ "documentation-tan": "",
+ "documentation-tanh": ""
+ }
+ },
"querybuilder": {
"additional-settings": {
"content-filter-metric-names-regex-search-using": "",
@@ -319,6 +416,13 @@
"title-add": "",
"title-remove": ""
},
+ "operation-utils": {
+ "getAggregationExplainer": {
+ "label-by": "",
+ "label-default": "",
+ "label-without": ""
+ }
+ },
"prom-query-builder-options": {
"aria-label-lower-limit-parameter": "",
"aria-label-select-resolution": "",
diff --git a/packages/grafana-prometheus/src/locales/fr-FR/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/fr-FR/grafana-prometheus.json
index 18813255785..409e95dcf48 100644
--- a/packages/grafana-prometheus/src/locales/fr-FR/grafana-prometheus.json
+++ b/packages/grafana-prometheus/src/locales/fr-FR/grafana-prometheus.json
@@ -209,6 +209,103 @@
"label-verbose": ""
}
},
+ "promql": {
+ "getAggregationOptions": {
+ "documentation-avg": "",
+ "documentation-bottomk": "",
+ "documentation-count": "",
+ "documentation-count-values": "",
+ "documentation-group": "",
+ "documentation-max": "",
+ "documentation-min": "",
+ "documentation-quantile": "",
+ "documentation-stddev": "",
+ "documentation-stdvar": "",
+ "documentation-sum": "",
+ "documentation-topk": ""
+ },
+ "getFunctions": {
+ "documentation-abs": "",
+ "documentation-absent": "",
+ "documentation-absent-over-time": "",
+ "documentation-avg-over-time": "",
+ "documentation-ceil": "",
+ "documentation-changes": "",
+ "documentation-clamp": "",
+ "documentation-clamp-max": "",
+ "documentation-clamp-min": "",
+ "documentation-count-over-time": "",
+ "documentation-count-scalar": "",
+ "documentation-day-of-month": "",
+ "documentation-day-of-week": "",
+ "documentation-day-of-year": "",
+ "documentation-days-in-month": "",
+ "documentation-deg": "",
+ "documentation-delta": "",
+ "documentation-deriv": "",
+ "documentation-double-exponential-smoothing": "",
+ "documentation-drop-common-labels": "",
+ "documentation-exp": "",
+ "documentation-floor": "",
+ "documentation-histogram-avg": "",
+ "documentation-histogram-count": "",
+ "documentation-histogram-fraction": "",
+ "documentation-histogram-quantile": "",
+ "documentation-histogram-stddev": "",
+ "documentation-histogram-stdvar": "",
+ "documentation-histogram-sum": "",
+ "documentation-holt-winters": "",
+ "documentation-hour": "",
+ "documentation-idelta": "",
+ "documentation-increase": "",
+ "documentation-info": "",
+ "documentation-irate": "",
+ "documentation-label-join": "",
+ "documentation-label-replace": "",
+ "documentation-last-over-time": "",
+ "documentation-ln": "",
+ "documentation-log10": "",
+ "documentation-log2": "",
+ "documentation-max-over-time": "",
+ "documentation-min-over-time": "",
+ "documentation-minute": "",
+ "documentation-month": "",
+ "documentation-pi": "",
+ "documentation-predict-linear": "",
+ "documentation-present-over-time": "",
+ "documentation-quantile-over-time": "",
+ "documentation-rad": "",
+ "documentation-rate": "",
+ "documentation-resets": "",
+ "documentation-round": "",
+ "documentation-scalar": "",
+ "documentation-sgn": "",
+ "documentation-sort": "",
+ "documentation-sort-desc": "",
+ "documentation-sqrt": "",
+ "documentation-stddev-over-time": "",
+ "documentation-stdvar-over-time": "",
+ "documentation-sum-over-time": "",
+ "documentation-time": "",
+ "documentation-timestamp": "",
+ "documentation-vector": "",
+ "documentation-year": ""
+ },
+ "getTrigonometricFunctions": {
+ "documentation-acos": "",
+ "documentation-acosh": "",
+ "documentation-asin": "",
+ "documentation-asinh": "",
+ "documentation-atan": "",
+ "documentation-atanh": "",
+ "documentation-cos": "",
+ "documentation-cosh": "",
+ "documentation-sin": "",
+ "documentation-sinh": "",
+ "documentation-tan": "",
+ "documentation-tanh": ""
+ }
+ },
"querybuilder": {
"additional-settings": {
"content-filter-metric-names-regex-search-using": "Filtrez les noms de métriques par recherche d’expression régulière, en utilisant un appel supplémentaire sur l’API Prometheus.",
@@ -319,6 +416,13 @@
"title-add": "Ajouter {{name}}",
"title-remove": "Supprimer {{name}}"
},
+ "operation-utils": {
+ "getAggregationExplainer": {
+ "label-by": "",
+ "label-default": "",
+ "label-without": ""
+ }
+ },
"prom-query-builder-options": {
"aria-label-lower-limit-parameter": "Définir la limite inférieure pour le paramètre d’étape",
"aria-label-select-resolution": "Sélectionner une résolution",
diff --git a/packages/grafana-prometheus/src/locales/hu-HU/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/hu-HU/grafana-prometheus.json
index 80848ade77a..22bc5c9c64b 100644
--- a/packages/grafana-prometheus/src/locales/hu-HU/grafana-prometheus.json
+++ b/packages/grafana-prometheus/src/locales/hu-HU/grafana-prometheus.json
@@ -2,201 +2,201 @@
"grafana-prometheus": {
"components": {
"annotation-query-editor": {
- "annotation-data-load-error": "",
- "aria-label-lower-limit-parameter": "",
- "label-min-step": "",
- "label-series-value-as-timestamp": "",
+ "annotation-data-load-error": "Hiba a jegyzetadatok betöltése során.",
+ "aria-label-lower-limit-parameter": "Állítsa be a léptékparaméter alsó határát",
+ "label-min-step": "Min. lépték",
+ "label-series-value-as-timestamp": "Sorozatérték időbélyegként",
"label-tags": "Címkék",
- "label-text": "",
+ "label-text": "Szöveg",
"label-title": "Cím",
- "placeholder-auto": "",
- "tooltip-either-pattern-example-instance-replaced-label": "",
- "tooltip-min-step": "",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": ""
+ "placeholder-auto": "automatikus",
+ "tooltip-either-pattern-example-instance-replaced-label": "Használja a nevet vagy egy mintázatot. Például a(z) {{labelTemplate}} helyébe a(z) {{labelName}} címke címkeértéke lép.",
+ "tooltip-min-step": "További alsó határérték a Prometheus-lekérdezés lépésparaméteréhez, valamint a(z) <2>{{intervalVar}}2> és <4>{{rateIntervalVar}}4> változóhoz.",
+ "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "Az időbélyeg mértékegysége az ezredmásodperc. Ha a sorozatérték mértékegysége a másodperc, szorozza meg a tartományvektorát 1000-rel."
},
"get-query-type-options": {
"description": {
- "instant-query-range": ""
+ "instant-query-range": "Azonnali lekérdezés és tartománylekérdezés futtatása"
},
"label": {
- "both": ""
+ "both": "Mindkettő"
},
"range-options": {
"description": {
- "query-range": ""
+ "query-range": "Lekérdezés futtatása egy időtartományban"
},
"label": {
- "instant": "",
- "range": ""
+ "instant": "Azonnali",
+ "range": "Tartomány"
}
}
},
"label-selector": {
- "aria-label-filter-expression-for-label": "",
- "description-select-labels": "",
- "select-labels-to-search-in": ""
+ "aria-label-filter-expression-for-label": "Szűrőkifejezés címkéhez",
+ "description-select-labels": "A címkeértékek kiválasztása után csak a lehetséges címkekombinációk jelennek meg.",
+ "select-labels-to-search-in": "2. Válassza ki a kereséshez használni kívánt címkéket"
},
"metric-selector": {
- "aria-label-filter-expression-for-metric": "",
- "aria-label-limit-results-from-series-endpoint": "",
- "description-series-limit": "",
- "label-select-metric": "",
- "select-a-metric": "",
- "series-limit": ""
+ "aria-label-filter-expression-for-metric": "Szűrőkifejezés a metrikához",
+ "aria-label-limit-results-from-series-endpoint": "A sorozat végpontjáról származó eredmények korlátozása",
+ "description-series-limit": "A korlát minden metrikára, címkére és értékre vonatkozik. Hagyja üresen a mezőt az alapértelmezett korlát használatához. Állítsa 0-ra a korlát letiltásához és az összes lekéréséhez – ez teljesítményproblémákat okozhat.",
+ "label-select-metric": "A metrika kiválasztása után csak a lehetséges címkék jelennek meg. A címkéket az alábbi sorozatkorlát korlátozza.",
+ "select-a-metric": "1. Válasszon egy metrikát",
+ "series-limit": "Sorozatkorlát"
},
"prom-cheat-sheet": {
- "prom-ql-cheat-sheet": ""
+ "prom-ql-cheat-sheet": "PromQL-puska"
},
"prom-exemplar-field": {
- "exemplars": "",
- "tooltip-disable-query": "",
- "tooltip-enable-query": ""
+ "exemplars": "Mintapéldányok",
+ "tooltip-disable-query": "Mintapéldányokkal rendelkező lekérdezések letiltása",
+ "tooltip-enable-query": "Mintapéldányokkal rendelkező lekérdezések engedélyezése"
},
"prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "",
- "aria-label-query-type-field": "",
- "aria-label-step-field": "",
- "min-step": "",
- "query-type": "",
- "tooltip-units-builtin-variables-example-interval-rateinterval": ""
+ "aria-label-prometheus-extra-field": "Prometheus extra mező",
+ "aria-label-query-type-field": "Lekérdezéstípus mező",
+ "aria-label-step-field": "Lépték mező",
+ "min-step": "Min. lépték",
+ "query-type": "Lekérdezés típusa",
+ "tooltip-units-builtin-variables-example-interval-rateinterval": "Itt időegységek és beépített változók használhatók, például: {{example1}}, {{example2}}, {{example3}}, {{example4}}, {{example5}}, {{example6}}, {{example7}} (alapértelmezett, ha nincs megadva mértékegység: {{default}})"
},
"prom-query-field": {
- "placeholder-enter-a-prom-ql-query": ""
+ "placeholder-enter-a-prom-ql-query": "Írjon be egy PromQL-lekérdezést…"
},
"prom-variable-query-editor": {
- "aria-label-classic-query": "",
- "aria-label-metric-regex": "",
- "aria-label-metric-selector": "",
- "aria-label-prometheus-query": "",
- "aria-label-query-type": "",
- "aria-label-series-query": "",
- "label-classic-query": "",
+ "aria-label-classic-query": "Klasszikus lekérdezés",
+ "aria-label-metric-regex": "Metrika reguláris kifejezése",
+ "aria-label-metric-selector": "Metrikaválasztó",
+ "aria-label-prometheus-query": "Prometheus-lekérdezés",
+ "aria-label-query-type": "Lekérdezés típusa",
+ "aria-label-series-query": "Sorozatlekérdezés",
+ "label-classic-query": "Klasszikus lekérdezés",
"label-label": "Címke",
- "label-metric-regex": "",
+ "label-metric-regex": "Metrika reguláris kifejezése",
"label-query": "Lekérdezés",
- "label-query-type": "",
- "label-series-query": "",
- "placeholder-classic-query": "",
- "placeholder-metric-regex": "",
- "placeholder-prometheus-query": "",
+ "label-query-type": "Lekérdezés típusa",
+ "label-series-query": "Sorozatlekérdezés",
+ "placeholder-classic-query": "Klasszikus lekérdezés",
+ "placeholder-metric-regex": "Metrika reguláris kifejezése",
+ "placeholder-prometheus-query": "Prometheus-lekérdezés",
"placeholder-select-query-type": "Lekérdezéstípus kiválasztása",
- "placeholder-series-query": "",
- "returns-metrics-matching-specified-metric-regex": "",
- "tooltip-classic-query": "",
- "tooltip-label": "",
- "tooltip-metric-regex": "",
- "tooltip-query": "",
- "tooltip-query-type": "",
- "tooltip-series-query": ""
+ "placeholder-series-query": "Sorozatlekérdezés",
+ "returns-metrics-matching-specified-metric-regex": "A megadott metrikai reguláris kifejezésnek megfelelő metrikák listáját adja vissza.",
+ "tooltip-classic-query": "A Prometheus változólekérdezés-szerkesztő eredeti implementációja. Adjon meg egy karakterláncot a megfelelő lekérdezéstípussal és paraméterekkel, a jelen dokumentumokban leírtak szerint. Például: {{exampleQuery}}.",
+ "tooltip-label": "A címke nevéhez tartozó címkeértékek listáját adja vissza az összes metrikában, kivéve, ha a metrika meg van adva.",
+ "tooltip-metric-regex": "A címkenevek listáját adja vissza, opcionálisan a megadott metrikai reguláris kifejezés szerint szűrve.",
+ "tooltip-query": "A lekérdezéshez a Prometheus-lekérdezési eredmények listáját adja vissza. Ez magában foglalhatja a Prometheus-funkciókat, azaz {{exampleQuery}}.",
+ "tooltip-query-type": "A Prometheus adatforrás-beépülőmodul a következő lekérdezéstípusokat biztosítja a sablonváltozókhoz.",
+ "tooltip-series-query": "Adjon meg egy metrikát címkékkel, csak egy metrikát vagy csak címkéket: {{example1}}, {{example2}} vagy {{example3}}. A bevitt adatokhoz társított idősorok listáját adja vissza."
},
"selector-actions": {
- "aria-label-selector": "",
- "aria-label-selector-clear-button": "",
- "aria-label-use-selector-as-metrics-button": "",
- "aria-label-use-selector-for-query-button": "",
- "aria-label-validate-submit-button": "",
+ "aria-label-selector": "választó",
+ "aria-label-selector-clear-button": "Választó törlése gomb",
+ "aria-label-use-selector-as-metrics-button": "Választó használata metrikaként gomb",
+ "aria-label-use-selector-for-query-button": "Választó használata lekérdezéshez gomb",
+ "aria-label-validate-submit-button": "Küldés érvényesítése gomb",
"clear": "Törlés",
- "resulting-selector": "",
- "use-as-rate-query": "",
- "use-query": "",
- "validate-selector": ""
+ "resulting-selector": "4. Eredményként kapott választó",
+ "use-as-rate-query": "Használat értékeléses lekérdezésként",
+ "use-query": "Lekérdezés használata",
+ "validate-selector": "Választó érvényesítése"
},
"value-selector": {
- "aria-label-filter-expression-for-label-values": "",
- "aria-label-values-for": "",
- "description-search-field-values-across-selected-labels": "",
- "select-multiple-values-for-your-labels": ""
+ "aria-label-filter-expression-for-label-values": "Szűrőkifejezés címkeértékekhez",
+ "aria-label-values-for": "Értékek a következőhöz: {{labelKey}}",
+ "description-search-field-values-across-selected-labels": "A keresőmező segítségével kereshet értékeket a kiválasztott címkék között.",
+ "select-multiple-values-for-your-labels": "3. Válasszon (több) értéket a címkéihez"
}
},
"configuration": {
"alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "",
- "label-manage-alerts-via-alerting-ui": "",
+ "label-allow-as-recording-rules-target": "Engedélyezés felvételkészítési szabályok céljaként",
+ "label-manage-alerts-via-alerting-ui": "Riasztások kezelése az Alerting kezelőfelületén keresztül",
"title-alerting": "Riasztás",
- "tooltip-allow-as-recording-rules-target": "",
+ "tooltip-allow-as-recording-rules-target": "Engedélyezze, hogy ez az adatforrás célként legyen kiválasztva a felvételkészítési szabályok írásához.",
"tooltip-manage-alerts-via-alerting-ui": "Riasztási szabályok kezelése ehhez az adatforráshoz. Más Alerting-erőforrások kezeléséhez adjon hozzá egy Alertmanager-adatforrást."
},
"config-editor": {
- "browser-access-mode-error": "",
- "description-advanced-settings": "",
+ "browser-access-mode-error": "A Prometheus-adatforrás böngészős hozzáférési módja már nem érhető el. Váltás kiszolgáló-hozzáférési módra.",
+ "description-advanced-settings": "A további beállítások olyan opcionális beállítások, amelyek konfigurálhatók az adatforrás nagyobb mértékű ellenőrzése érdekében.",
"title-advanced-settings": "Speciális beállítások",
"title-error": "Hiba"
},
"data-source-http-settings-overhaul": {
"tooltip-browser-access-mode": "Az Ön hozzáférési módja <1>Böngésző1>, ez azt jelenti, hogy az URL-címnek elérhetőnek kell lennie a böngészőből.",
- "tooltip-http-url": "",
+ "tooltip-http-url": "Adjon meg egy teljes HTTP URL-címet (például: {{exampleURL}})",
"tooltip-server-access-mode": "Az Ön hozzáférési módja <1>Kiszolgáló1>, ez azt jelenti, hogy az URL-címnek elérhetőnek kell lennie a Grafana-háttérrendszerből/-kiszolgálóról."
},
"docs-tip": {
- "visit-docs-for-more-details-here": ""
+ "visit-docs-for-more-details-here": "További részletekért tekintse meg a dokumentumokat itt."
},
"exemplar-setting": {
"label-data-source": "Adatforrás",
- "label-internal-link": "",
+ "label-internal-link": "Belső hivatkozás",
"label-label-name": "Címkenév",
- "label-remove-exemplar-link": "",
+ "label-remove-exemplar-link": "Mintapéldány-hivatkozás eltávolítása",
"label-url": "URL-cím",
- "label-url-label": "",
- "placeholder-go-to-examplecom": "",
- "placeholder-httpsexamplecomvalueraw": "",
- "placeholder-trace-id": "",
- "title-remove-exemplar-link": "",
- "tooltip-data-source": "",
- "tooltip-internal-link": "",
- "tooltip-label-name": "",
- "tooltip-url": "",
- "tooltip-url-label": ""
+ "label-url-label": "URL-címke",
+ "placeholder-go-to-examplecom": "Tovább az example.com webhelyre",
+ "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
+ "placeholder-trace-id": "traceID",
+ "title-remove-exemplar-link": "Mintapéldány-hivatkozás eltávolítása",
+ "tooltip-data-source": "A mintapéldány ehhez az adatforráshoz fog navigálni.",
+ "tooltip-internal-link": "Engedélyezze ezt a lehetőséget, ha van belső hivatkozása. Ha engedélyezve van, megjeleníti az adatforrás-választót. Válassza ki a háttérrendszeri követési adattárat a mintapéldány-adatokhoz.",
+ "tooltip-label-name": "A címkeobjektum azon mezőjének neve, amelyet a traceID lekéréséhez kell használni.",
+ "tooltip-url": "A nyomkövetési háttérrendszer URL-címe, ahová a felhasználó menne, hogy lássa a nyomkövetést",
+ "tooltip-url-label": "Használja a gombcímke felülbírálásához a mintapéldány traceID mezőjén."
},
"exemplars-settings": {
"add": "Hozzáadás",
- "no-exemplars-configurations": "",
- "title-exemplars": ""
+ "no-exemplars-configurations": "Nincsenek mintapéldány-konfigurációk",
+ "title-exemplars": "Mintapéldányok"
},
"prom-settings": {
- "aria-label-default-editor": "",
- "aria-label-prom-type-type": "",
- "aria-label-prometheus-type": "",
- "aria-label-select-http-method": "",
+ "aria-label-default-editor": "Alapértelmezett szerkesztő (kód vagy építő)",
+ "aria-label-prom-type-type": "{{promType}} típusa",
+ "aria-label-prometheus-type": "Prometheus-típus",
+ "aria-label-select-http-method": "HTTP-módszer kiválasztása",
"editor-options": {
"label-builder": "",
"label-code": ""
},
- "label-cache-level": "",
- "label-custom-query-parameters": "",
- "label-default-editor": "",
- "label-disable-metrics-lookup": "",
- "label-disable-recording-rules-beta": "",
- "label-http-method": "",
- "label-incremental-querying-beta": "",
- "label-metric-names-suggestion-limit": "",
- "label-prom-type-version": "",
- "label-prometheus-type": "",
- "label-query-overlap-window": "",
- "label-query-timeout": "",
- "label-scrape-interval": "",
- "label-series-limit": "",
- "label-use-series-endpoint": "",
- "more-info": "",
- "placeholder-example-maxsourceresolutionmtimeout": "",
- "title-interval-behaviour": "",
- "title-other": "",
+ "label-cache-level": "Gyorsítótár szintje",
+ "label-custom-query-parameters": "Egyéni lekérdezési paraméterek",
+ "label-default-editor": "Alapértelmezett szerkesztő",
+ "label-disable-metrics-lookup": "Metrikák keresésének letiltása",
+ "label-disable-recording-rules-beta": "Felvételkészítési szabályok letiltása (béta)",
+ "label-http-method": "HTTP-metódus",
+ "label-incremental-querying-beta": "Növekményes lekérdezés (béta)",
+ "label-metric-names-suggestion-limit": "Metrikanevek javaslatának korlátja",
+ "label-prom-type-version": "{{promType}} verziója",
+ "label-prometheus-type": "Prometheus-típus",
+ "label-query-overlap-window": "Lekérdezésátfedési ablak",
+ "label-query-timeout": "Lekérdezési időtúllépés",
+ "label-scrape-interval": "Adatgyűjtési intervallum",
+ "label-series-limit": "Sorozatkorlát",
+ "label-use-series-endpoint": "Sorozat végpontjának használata",
+ "more-info": "A Prometheus-típus és -verzió adatforrásokban történő konfigurálásával kapcsolatos további információkért tekintse meg a <2>kiépítési dokumentációt2>.",
+ "placeholder-example-maxsourceresolutionmtimeout": "Példa: {{example}}",
+ "title-interval-behaviour": "Intervallum viselkedése",
+ "title-other": "Egyéb",
"title-performance": "Teljesítmény",
- "title-query-editor": "",
- "tooltip-cache-level": "",
- "tooltip-custom-query-parameters": "",
- "tooltip-default-editor": "",
- "tooltip-disable-metrics-lookup": "",
- "tooltip-disable-recording-rules-beta": "",
- "tooltip-http-method": "",
- "tooltip-incremental-querying-beta": "",
- "tooltip-metric-names-suggestion-limit": "",
- "tooltip-prom-type-version": "",
- "tooltip-prometheus-type": "",
- "tooltip-query-overlap-window": "",
- "tooltip-query-timeout": "",
- "tooltip-scrape-interval": "",
- "tooltip-series-limit": "",
- "tooltip-use-series-endpoint": ""
+ "title-query-editor": "Lekérdezésszerkesztő",
+ "tooltip-cache-level": "Beállítja a böngésző gyorsítótárának szintjét a szerkesztői lekérdezésekhez. A magasabb számossági adatforrásokhoz magasabb gyorsítótár-beállítások ajánlottak.",
+ "tooltip-custom-query-parameters": "Egyéni paraméterek hozzáadása a Prometheus lekérdezési URL-jéhez. Például: {{example1}}, {{example2}}, {{example3}} vagy {{example4}}. Több paramétert a következővel kell összefűzni: {{concatenationChar}}.",
+ "tooltip-default-editor": "Beállítja az alapértelmezett szerkesztőopciót az adatforrás minden felhasználója számára.",
+ "tooltip-disable-metrics-lookup": "Ennek az opciónak a bejelölése letiltja a metrikaválasztót és a metrika-/címketámogatást a lekérdezési mező automatikus kitöltésében. Ez segít, ha a nagyobb Prometheus-példányokkal teljesítményproblémái vannak. ",
+ "tooltip-disable-recording-rules-beta": "Ez a funkció letiltja a felvételkészítési szabályokat. Kapcsolja be az irányítópult teljesítményének javítása érdekében",
+ "tooltip-http-method": "A Prometheus-adatforrás lekérdezéséhez használhatja a POST- vagy a GET HTTP-metódust. A POST az ajánlott metódus, mivel nagyobb lekérdezéseket tesz lehetővé. Módosítsa ezt GET-re, ha a Prometheus-verziója régebbi, mint a 2.1-es, vagy ha a POST-kérések korlátozva vannak a hálózatában.",
+ "tooltip-incremental-querying-beta": "Ez a funkció megváltoztatja a relatív lekérdezések azon alapértelmezett viselkedését, hogy mindig friss adatokat kérjenek le a Prometheus-példányból, ehelyett a lekérdezési eredményeket a rendszer gyorsítótárazza, és csak új rekordok lesznek lekérve. Kapcsolja be az adatbázis és a hálózat terhelésének csökkentése érdekében.",
+ "tooltip-metric-names-suggestion-limit": "Azon metrikanevek maximális száma, amelyek automatikus kitöltési javaslatként jelenhetnek meg a lekérdezésszerkesztő Kód módjában.",
+ "tooltip-prom-type-version": "Ezzel állíthatja be a(z) {{promType}}-példány verzióját, ha nincs automatikusan konfigurálva.",
+ "tooltip-prometheus-type": "Állítsa be a Prometheus-adatbázis típusára, pl.: Prometheus, Cortex, Mimir vagy Thanos. A mező módosításával menti az aktuális beállításokat. A Prometheus bizonyos típusai támogatják vagy nem támogatják a különböző API-kat. Például egyes típusok támogatják a reguláris kifejezéses egyeztetést a címkelekérdezésekhez a teljesítmény javítása érdekében. Egyes típusok rendelkeznek API-val a metaadatokhoz. Ha ezt helytelenül állítja be, furcsa viselkedést tapasztalhat a metrikák és címkék lekérdezésekor. Ellenőrizze a Prometheus dokumentációját, hogy biztosan a megfelelő típust adja meg.",
+ "tooltip-query-overlap-window": "Állítson be egy időtartamot, például: {{example1}}, vagy {{example2}}, vagy {{example3}}. A(z) {{default}} alapértelmezése. Ez az időtartam hozzáadódik az egyes növekményes kérések időtartamához.",
+ "tooltip-query-timeout": "Állítsa be a Prometheus lekérdezési időtúllépését.",
+ "tooltip-scrape-interval": "Ez az intervallum azt mutatja, hogy a Prometheus milyen gyakran gyűjt adatokat a célokról. Állítsa be a Prometheus konfigurációs fájljában konfigurált tipikus adatgyűjtési és értékelési intervallumra. Ha ezt nagyobb értékre állítja, mint a Prometheus konfigurációs fájljának intervalluma, a Grafana ennek az intervallumnak megfelelően értékeli az adatokat, és kevesebb adatpontot fog látni. Alapértelmezett érték: {{default}}.",
+ "tooltip-series-limit": "A korlát minden erőforrásra (metrikára, címkére és értékre) vonatkozik mindkét végpont (sorozatok és címkék) esetében. Hagyja üresen a mezőt az alapértelmezett korlát (40 000) használatához. Állítsa 0-ra a korlát letiltásához és az összes lekéréséhez – ez teljesítményproblémákat okozhat. Az alapértelmezett korlát 40 000.",
+ "tooltip-use-series-endpoint": "Ennek az opciónak a bejelölésével előnyben részesíti a sorozat végpontját {{exampleParameter}} paraméterrel a címkeértékek végpontjához képest {{exampleParameter}} paraméterrel. Bár a címkeértékek végpontja hatékonyabbnak tekinthető, egyes felhasználók előnyben részesíthetik a sorozatot, mert rendelkezik POST-metódussal, míg a címkeértékek végpontja csak GET-metódussal rendelkezik."
}
},
"prom-query-legend-editor": {
@@ -209,14 +209,111 @@
"label-verbose": ""
}
},
+ "promql": {
+ "getAggregationOptions": {
+ "documentation-avg": "",
+ "documentation-bottomk": "",
+ "documentation-count": "",
+ "documentation-count-values": "",
+ "documentation-group": "",
+ "documentation-max": "",
+ "documentation-min": "",
+ "documentation-quantile": "",
+ "documentation-stddev": "",
+ "documentation-stdvar": "",
+ "documentation-sum": "",
+ "documentation-topk": ""
+ },
+ "getFunctions": {
+ "documentation-abs": "",
+ "documentation-absent": "",
+ "documentation-absent-over-time": "",
+ "documentation-avg-over-time": "",
+ "documentation-ceil": "",
+ "documentation-changes": "",
+ "documentation-clamp": "",
+ "documentation-clamp-max": "",
+ "documentation-clamp-min": "",
+ "documentation-count-over-time": "",
+ "documentation-count-scalar": "",
+ "documentation-day-of-month": "",
+ "documentation-day-of-week": "",
+ "documentation-day-of-year": "",
+ "documentation-days-in-month": "",
+ "documentation-deg": "",
+ "documentation-delta": "",
+ "documentation-deriv": "",
+ "documentation-double-exponential-smoothing": "",
+ "documentation-drop-common-labels": "",
+ "documentation-exp": "",
+ "documentation-floor": "",
+ "documentation-histogram-avg": "",
+ "documentation-histogram-count": "",
+ "documentation-histogram-fraction": "",
+ "documentation-histogram-quantile": "",
+ "documentation-histogram-stddev": "",
+ "documentation-histogram-stdvar": "",
+ "documentation-histogram-sum": "",
+ "documentation-holt-winters": "",
+ "documentation-hour": "",
+ "documentation-idelta": "",
+ "documentation-increase": "",
+ "documentation-info": "",
+ "documentation-irate": "",
+ "documentation-label-join": "",
+ "documentation-label-replace": "",
+ "documentation-last-over-time": "",
+ "documentation-ln": "",
+ "documentation-log10": "",
+ "documentation-log2": "",
+ "documentation-max-over-time": "",
+ "documentation-min-over-time": "",
+ "documentation-minute": "",
+ "documentation-month": "",
+ "documentation-pi": "",
+ "documentation-predict-linear": "",
+ "documentation-present-over-time": "",
+ "documentation-quantile-over-time": "",
+ "documentation-rad": "",
+ "documentation-rate": "",
+ "documentation-resets": "",
+ "documentation-round": "",
+ "documentation-scalar": "",
+ "documentation-sgn": "",
+ "documentation-sort": "",
+ "documentation-sort-desc": "",
+ "documentation-sqrt": "",
+ "documentation-stddev-over-time": "",
+ "documentation-stdvar-over-time": "",
+ "documentation-sum-over-time": "",
+ "documentation-time": "",
+ "documentation-timestamp": "",
+ "documentation-vector": "",
+ "documentation-year": ""
+ },
+ "getTrigonometricFunctions": {
+ "documentation-acos": "",
+ "documentation-acosh": "",
+ "documentation-asin": "",
+ "documentation-asinh": "",
+ "documentation-atan": "",
+ "documentation-atanh": "",
+ "documentation-cos": "",
+ "documentation-cosh": "",
+ "documentation-sin": "",
+ "documentation-sinh": "",
+ "documentation-tan": "",
+ "documentation-tanh": ""
+ }
+ },
"querybuilder": {
"additional-settings": {
- "content-filter-metric-names-regex-search-using": "",
- "disable-text-wrap": ""
+ "content-filter-metric-names-regex-search-using": "A metrikanevek szűrése reguláris kifejezéses kereséssel, a Prometheus API további hívásával.",
+ "disable-text-wrap": "Sortörés letiltása"
},
"feedback-link": {
"give-feedback": "Visszajelzés küldése",
- "title-give-feedback": ""
+ "title-give-feedback": "A metrikaböngésző új, és számítunk az építő jellegű visszajelzésére"
},
"get-collapsed-info": {
"exemplars": "",
@@ -250,18 +347,18 @@
},
"handle-function": {
"text": {
- "query-parsing-is-ambiguous": ""
+ "query-parsing-is-ambiguous": "A lekérdezés elemzése nem egyértelmű."
}
},
"label-filter-item": {
- "aria-label-remove": "",
- "placeholder-select-label": "",
+ "aria-label-remove": "{{name}} eltávolítása",
+ "placeholder-select-label": "Címke kiválasztása",
"placeholder-select-value": "Érték kijelölése"
},
"label-filters": {
- "label-filters": "",
- "label-label-filters": "",
- "tooltip-label-filters": ""
+ "label-filters": "Címkeszűrők",
+ "label-label-filters": "Címkeszűrők",
+ "tooltip-label-filters": "Opcionális: a lekérdezéstípushoz kiválasztott metrika szűrésére szolgál."
},
"label-param-editor": {
"loadingMessage-loading-labels": "",
@@ -269,92 +366,99 @@
},
"metric-combobox": {
"async-select": {
- "aria-label-open-metrics-explorer": "",
- "placeholder-select-metric": "",
- "tooltip-open-metrics-explorer": ""
+ "aria-label-open-metrics-explorer": "Metrikaböngésző megnyitása",
+ "placeholder-select-metric": "Metrika kiválasztása",
+ "tooltip-open-metrics-explorer": "Metrikaböngésző megnyitása"
},
"label-metric": "Metrika",
- "tooltip-metric": ""
+ "tooltip-metric": "Opcionális: a megadott metrikában a címke nevéhez tartozó címkeértékek listáját adja vissza."
},
"metrics-modal": {
- "additional-settings": "",
+ "additional-settings": "További beállítások",
"aria-label-additional-settings": "További beállítások",
- "aria-label-browse-metrics": "",
- "currently-selected": "",
- "metrics-pre-filtered": "",
- "placeholder-results-per-page": "",
- "results-per-page": "",
- "title-metrics-explorer": "",
- "results-amount_one": "",
- "results-amount_other": ""
+ "aria-label-browse-metrics": "Metrikák böngészése",
+ "currently-selected": "Jelenleg kiválasztott: {{selected}}",
+ "metrics-pre-filtered": "Ezek a metrikák előszűrtek a címkeszűrőkben kiválasztott címkék alapján.",
+ "placeholder-results-per-page": "találat oldalanként",
+ "results-per-page": "Találatok száma oldalanként",
+ "title-metrics-explorer": "Metrikaböngésző",
+ "results-amount_one": "{{count}}/{{num}} találat megjelenítése",
+ "results-amount_other": "{{count}}/{{num}} találat megjelenítése"
},
"nested-query": {
"label": {
- "ignoring": "",
+ "ignoring": "Mellőzés",
"on": "Be"
},
"operator": "Műveleti jel",
- "tooltip-remove-match": "",
- "vector-matches": ""
+ "tooltip-remove-match": "Egyezés eltávolítása",
+ "vector-matches": "Vektoregyezések"
},
"operation-editor": {
- "not-found": "",
- "title-remove": ""
+ "not-found": "A(z) {{id}} művelet nem található",
+ "title-remove": "{{name}} eltávolítása"
},
"operation-header": {
"placeholder-replace-with": "Csere ezzel:",
- "title-click-to-view-alternative-operations": "",
- "title-remove-operation": ""
+ "title-click-to-view-alternative-operations": "Kattintson az alternatív műveletek megtekintéséhez",
+ "title-remove-operation": "Művelet eltávolítása"
},
"operation-info-button": {
- "title-click-to-show-description": "",
- "title-remove-operation": ""
+ "title-click-to-show-description": "Kattintson a leírás megjelenítéséhez",
+ "title-remove-operation": "Művelet eltávolítása"
},
"operation-list": {
- "operations": "",
+ "operations": "Műveletek",
"placeholder-search": "Keresés",
- "title-add-operation": ""
+ "title-add-operation": "Művelet hozzáadása"
},
"operation-param-editor": {
- "title-add": "",
- "title-remove": ""
+ "title-add": "{{name}} hozzáadása",
+ "title-remove": "{{name}} eltávolítása"
+ },
+ "operation-utils": {
+ "getAggregationExplainer": {
+ "label-by": "",
+ "label-default": "",
+ "label-without": ""
+ }
},
"prom-query-builder-options": {
- "aria-label-lower-limit-parameter": "",
- "aria-label-select-resolution": "",
+ "aria-label-lower-limit-parameter": "Állítsa be a léptékparaméter alsó határát",
+ "aria-label-select-resolution": "Felbontás kiválasztása",
"format-options": {
"label-heatmap": "",
"label-table": "",
"label-time-series": ""
},
- "label-exemplars": "",
+ "label-exemplars": "Mintapéldányok",
"label-format": "Formátum",
- "label-min-step": "",
- "label-resolution": "",
+ "label-min-step": "Min. lépték",
+ "label-resolution": "Felbontás",
"label-type": "Típus",
- "placeholder-auto": "",
+ "placeholder-auto": "automatikus",
"title-options": "Beállítások",
- "tooltip-min-step": ""
+ "tooltip-min-step": "További alsó határérték a Prometheus-lekérdezés léptékparaméteréhez, valamint a(z) <2>{{interval}}2> és <4>{{rateInterval}}4> változóhoz."
},
"prom-query-code-editor-autocomplete-info": {
- "autocomplete-suggestions-limited": "",
- "tooltip-autocomplete-suggestions-limited": ""
+ "autocomplete-suggestions-limited": "Automatikus kitöltési javaslatok korlátozva",
+ "tooltip-autocomplete-suggestions-limited": "A metrikanevek száma meghaladja az automatikus kitöltés korlátját. Csak a(z) {{autocompleteLimit}} legrelevánsabb metrika jelenik meg. A küszöbértéket az adatforrás beállításai között módosíthatja."
},
"prom-query-editor-selector": {
"body-syntax-error": "",
"confirmText-continue": "",
"kick-start-your-query": "Előbeállításos lekérdezés",
- "label-explain": "",
- "run-queries": "",
- "title-parsing-error-switch-builder": ""
+ "label-explain": "Magyarázat",
+ "run-queries": "Lekérdezések futtatása",
+ "title-parsing-error-switch-builder": "Elemzési hiba: Váltás építő módba?"
},
"prom-query-legend-editor": {
- "label-legend": "",
- "placeholder-select-legend-mode": "",
- "tooltip-legend": ""
+ "label-legend": "Jelmagyarázat",
+ "placeholder-select-legend-mode": "Jelmagyarázat mód kiválasztása",
+ "tooltip-legend": "Sorozatnév felülbírálása vagy sablon. Például a(z) {{templateExample}} helyébe a(z) {{labelName}} címkeértéke lép."
},
"query-builder-hints": {
- "hint-details": ""
+ "hint-details": "tipp: {{hintDetails}}"
},
"query-editor-mode-toggle": {
"editor-modes": {
@@ -363,30 +467,30 @@
}
},
"query-pattern": {
- "apply-query": "",
- "aria-label-apply-query-starter-button": "",
- "aria-label-back-button": "",
- "aria-label-create-new-query-button": "",
- "aria-label-raw-query": "",
- "aria-label-use-this-query-button": "",
+ "apply-query": "Lekérdezés alkalmazása",
+ "aria-label-apply-query-starter-button": "lekérdezés-előbeállító alkalmazása gomb",
+ "aria-label-back-button": "vissza gomb",
+ "aria-label-create-new-query-button": "új lekérdezés létrehozása gomb",
+ "aria-label-raw-query": "{{patternName}} nyers lekérdezés",
+ "aria-label-use-this-query-button": "használja ezt a lekérdezést gomb",
"back": "Vissza",
- "create-new-query": "",
+ "create-new-query": "Új lekérdezés létrehozása",
"use-this-query": "Használja ezt a lekérdezést"
},
"query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "",
+ "aria-label-close-kick-start-your-query-modal": "előbeállításos lekérdezés modális ablakának bezárása",
"aria-label-kick-start-your-query-modal": "Előbeállításos lekérdezés modális ablak",
- "aria-label-toggle-query-starter": "",
+ "aria-label-toggle-query-starter": "{{patternType}} lekérdezés-előbeállító kártya megnyitása és bezárása",
"close": "Bezárás",
- "description-kick-start-your-query": "",
- "label-toggle-query-starter": "",
+ "description-kick-start-your-query": "Kezdje el létrehozni a lekérdezést előbeállításokkal az alábbi lekérdezések egyikének kiválasztásával. Ezután folytathatja a lekérdezés befejezését.",
+ "label-toggle-query-starter": "{{patternType}} lekérdezés-előbeállítók",
"title-kick-start-your-query": "Előbeállításos lekérdezés"
},
"raw-query": {
- "aria-label-selector": ""
+ "aria-label-selector": "választó"
},
"results-table": {
- "content-descriptive-type": "",
+ "content-descriptive-type": "{{descriptiveType}} létrehozásakor a Prometheus több, számláló típusú sorozatot jelenít meg. ",
"description": "Leírás",
"message-expand-label-filters": "",
"message-expand-search": "",
@@ -397,7 +501,7 @@
},
"update-function-args": {
"text": {
- "query-parsing-is-ambiguous": ""
+ "query-parsing-is-ambiguous": "A lekérdezés elemzése nem egyértelmű."
}
}
}
diff --git a/packages/grafana-prometheus/src/locales/id-ID/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/id-ID/grafana-prometheus.json
index 51f85b929bb..f80f5a3d833 100644
--- a/packages/grafana-prometheus/src/locales/id-ID/grafana-prometheus.json
+++ b/packages/grafana-prometheus/src/locales/id-ID/grafana-prometheus.json
@@ -2,201 +2,201 @@
"grafana-prometheus": {
"components": {
"annotation-query-editor": {
- "annotation-data-load-error": "",
- "aria-label-lower-limit-parameter": "",
- "label-min-step": "",
- "label-series-value-as-timestamp": "",
+ "annotation-data-load-error": "Terjadi kesalahan pemuatan data anotasi!",
+ "aria-label-lower-limit-parameter": "Tetapkan batas bawah untuk parameter langkah",
+ "label-min-step": "Langkah minimum",
+ "label-series-value-as-timestamp": "Nilai data seri sebagai stempel waktu",
"label-tags": "Tag",
- "label-text": "",
+ "label-text": "Teks",
"label-title": "Judul",
- "placeholder-auto": "",
- "tooltip-either-pattern-example-instance-replaced-label": "",
- "tooltip-min-step": "",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": ""
+ "placeholder-auto": "auto",
+ "tooltip-either-pattern-example-instance-replaced-label": "Gunakan nama atau pola. Misalnya, {{labelTemplate}} diganti dengan nilai label untuk label {{labelName}}.",
+ "tooltip-min-step": "Batas bawah tambahan untuk parameter langkah kueri Prometheus dan untuk variabel <2>{{intervalVar}}2> dan <4>{{rateIntervalVar}}4>.",
+ "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "Unit stempel waktu adalah milidetik. Jika satuan nilai data seri adalah detik, kalikan vektor rentangnya dengan 1000."
},
"get-query-type-options": {
"description": {
- "instant-query-range": ""
+ "instant-query-range": "Jalankan kueri Instan dan kueri Rentang"
},
"label": {
- "both": ""
+ "both": "Keduanya"
},
"range-options": {
"description": {
- "query-range": ""
+ "query-range": "Jalankan kueri selama rentang waktu tertentu"
},
"label": {
- "instant": "",
- "range": ""
+ "instant": "Instan",
+ "range": "Rentang"
}
}
},
"label-selector": {
- "aria-label-filter-expression-for-label": "",
- "description-select-labels": "",
- "select-labels-to-search-in": ""
+ "aria-label-filter-expression-for-label": "Filter persamaan berdasarkan label",
+ "description-select-labels": "Setelah nilai label dipilih, hanya kombinasi label yang mungkin yang ditampilkan.",
+ "select-labels-to-search-in": "2. Pilih label untuk pencarian"
},
"metric-selector": {
- "aria-label-filter-expression-for-metric": "",
- "aria-label-limit-results-from-series-endpoint": "",
- "description-series-limit": "",
- "label-select-metric": "",
- "select-a-metric": "",
- "series-limit": ""
+ "aria-label-filter-expression-for-metric": "Filter persamaan berdasarkan metrik",
+ "aria-label-limit-results-from-series-endpoint": "Batasi hasil dari titik akhir data seri",
+ "description-series-limit": "Batas ini berlaku untuk semua metrik, label, dan nilai. Biarkan bidang kosong untuk menggunakan batas default. Atur ke 0 untuk menonaktifkan batas dan mengambil semuanya — ini dapat menyebabkan masalah kinerja.",
+ "label-select-metric": "Setelah metrik dipilih, hanya label yang mungkin yang ditampilkan. Label dibatasi oleh batas data seri di bawah ini.",
+ "select-a-metric": "1. Pilih metrik",
+ "series-limit": "Batas data seri"
},
"prom-cheat-sheet": {
- "prom-ql-cheat-sheet": ""
+ "prom-ql-cheat-sheet": "Lembar Ringkasan PromQL"
},
"prom-exemplar-field": {
- "exemplars": "",
- "tooltip-disable-query": "",
- "tooltip-enable-query": ""
+ "exemplars": "Contoh",
+ "tooltip-disable-query": "Nonaktifkan kueri dengan contoh",
+ "tooltip-enable-query": "Aktifkan kueri dengan contoh"
},
"prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "",
- "aria-label-query-type-field": "",
- "aria-label-step-field": "",
- "min-step": "",
- "query-type": "",
- "tooltip-units-builtin-variables-example-interval-rateinterval": ""
+ "aria-label-prometheus-extra-field": "Bidang tambahan Prometheus",
+ "aria-label-query-type-field": "Bidang jenis kueri",
+ "aria-label-step-field": "Bidang langkah",
+ "min-step": "Langkah minimum",
+ "query-type": "Jenis kueri",
+ "tooltip-units-builtin-variables-example-interval-rateinterval": "Unit waktu dan variabel bawaan dapat digunakan di sini, misalnya: {{example1}}, {{example2}}, {{example3}}, {{example4}}, {{example5}}, {{example6}}, {{example7}} (Default jika tidak ada unit yang ditentukan: {{default}})"
},
"prom-query-field": {
- "placeholder-enter-a-prom-ql-query": ""
+ "placeholder-enter-a-prom-ql-query": "Masukkan kueri PromQL…"
},
"prom-variable-query-editor": {
- "aria-label-classic-query": "",
- "aria-label-metric-regex": "",
- "aria-label-metric-selector": "",
- "aria-label-prometheus-query": "",
- "aria-label-query-type": "",
- "aria-label-series-query": "",
- "label-classic-query": "",
+ "aria-label-classic-query": "Kueri Klasik",
+ "aria-label-metric-regex": "Ekspresi reguler metrik",
+ "aria-label-metric-selector": "Selektor metrik",
+ "aria-label-prometheus-query": "Kueri Prometheus",
+ "aria-label-query-type": "Jenis kueri",
+ "aria-label-series-query": "Kueri Data Seri",
+ "label-classic-query": "Kueri Klasik",
"label-label": "Label",
- "label-metric-regex": "",
+ "label-metric-regex": "Ekspresi reguler metrik",
"label-query": "Kueri",
- "label-query-type": "",
- "label-series-query": "",
- "placeholder-classic-query": "",
- "placeholder-metric-regex": "",
- "placeholder-prometheus-query": "",
+ "label-query-type": "Jenis kueri",
+ "label-series-query": "Kueri Data Seri",
+ "placeholder-classic-query": "Kueri Klasik",
+ "placeholder-metric-regex": "Ekspresi reguler metrik",
+ "placeholder-prometheus-query": "Kueri Prometheus",
"placeholder-select-query-type": "Pilih jenis kueri",
- "placeholder-series-query": "",
- "returns-metrics-matching-specified-metric-regex": "",
- "tooltip-classic-query": "",
- "tooltip-label": "",
- "tooltip-metric-regex": "",
- "tooltip-query": "",
- "tooltip-query-type": "",
- "tooltip-series-query": ""
+ "placeholder-series-query": "Kueri Data Seri",
+ "returns-metrics-matching-specified-metric-regex": "Mengembalikan daftar metrik yang sesuai dengan regex metrik yang ditentukan.",
+ "tooltip-classic-query": "Implementasi awal dari editor kueri variabel Prometheus. Masukkan string dengan jenis kueri dan parameter yang benar seperti yang dijelaskan dalam dokumen ini. Misalnya, {{exampleQuery}}.",
+ "tooltip-label": "Mengembalikan daftar nilai label untuk nama label di semua metrik kecuali metrik tersebut ditentukan.",
+ "tooltip-metric-regex": "Mengembalikan daftar nama label, secara opsional menyaring berdasarkan regex metrik yang ditentukan.",
+ "tooltip-query": "Mengembalikan daftar hasil kueri Prometheus untuk kueri tersebut. Ini dapat mencakup fungsi Prometheus, yaitu {{exampleQuery}}.",
+ "tooltip-query-type": "Plugin sumber data Prometheus menyediakan jenis kueri berikut untuk variabel templat.",
+ "tooltip-series-query": "Masukkan metrik dengan label, hanya metrik atau hanya label, yaitu {{example1}}, {{example2}}, atau {{example3}}. Mengembalikan daftar deret waktu yang terkait dengan data yang dimasukkan."
},
"selector-actions": {
- "aria-label-selector": "",
- "aria-label-selector-clear-button": "",
- "aria-label-use-selector-as-metrics-button": "",
- "aria-label-use-selector-for-query-button": "",
- "aria-label-validate-submit-button": "",
+ "aria-label-selector": "selektor",
+ "aria-label-selector-clear-button": "Tombol hapus selektor",
+ "aria-label-use-selector-as-metrics-button": "Gunakan selektor sebagai tombol metrik",
+ "aria-label-use-selector-for-query-button": "Gunakan selektor untuk tombol kueri",
+ "aria-label-validate-submit-button": "Validasi tombol kirim",
"clear": "Hapus",
- "resulting-selector": "",
- "use-as-rate-query": "",
- "use-query": "",
- "validate-selector": ""
+ "resulting-selector": "4. Selektor yang dihasilkan",
+ "use-as-rate-query": "Gunakan sebagai kueri rate",
+ "use-query": "Gunakan kueri",
+ "validate-selector": "Validasi selektor"
},
"value-selector": {
- "aria-label-filter-expression-for-label-values": "",
- "aria-label-values-for": "",
- "description-search-field-values-across-selected-labels": "",
- "select-multiple-values-for-your-labels": ""
+ "aria-label-filter-expression-for-label-values": "Filter persamaan berdasarkan nilai label",
+ "aria-label-values-for": "Nilai untuk {{labelKey}}",
+ "description-search-field-values-across-selected-labels": "Gunakan bidang pencarian untuk menemukan nilai di seluruh label yang dipilih.",
+ "select-multiple-values-for-your-labels": "3. Pilih (beberapa) nilai untuk label Anda"
}
},
"configuration": {
"alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "",
- "label-manage-alerts-via-alerting-ui": "",
+ "label-allow-as-recording-rules-target": "Izinkan sebagai target aturan perekaman",
+ "label-manage-alerts-via-alerting-ui": "Kelola peringatan melalui UI Peringatan",
"title-alerting": "Alerting",
- "tooltip-allow-as-recording-rules-target": "",
+ "tooltip-allow-as-recording-rules-target": "Izinkan sumber data ini dipilih sebagai target untuk menulis aturan perekaman.",
"tooltip-manage-alerts-via-alerting-ui": "Kelola aturan peringatan untuk sumber data ini. Untuk mengelola sumber daya alerting lainnya, tambahkan sumber data Alertmanager."
},
"config-editor": {
- "browser-access-mode-error": "",
- "description-advanced-settings": "",
+ "browser-access-mode-error": "Mode akses browser di sumber data Prometheus tidak lagi tersedia. Beralih ke mode akses server.",
+ "description-advanced-settings": "Pengaturan tambahan adalah pengaturan opsional yang dapat dikonfigurasi agar memiliki kendali lebih besar atas sumber data Anda.",
"title-advanced-settings": "Pengaturan lanjutan",
"title-error": "Kesalahan"
},
"data-source-http-settings-overhaul": {
"tooltip-browser-access-mode": "Metode akses Anda adalah <1>Browser1>, ini berarti URL harus dapat diakses dari browser.",
- "tooltip-http-url": "",
+ "tooltip-http-url": "Tentukan URL HTTP lengkap (misalnya {{exampleURL}})",
"tooltip-server-access-mode": "Metode akses Anda adalah <1>Server1>, ini berarti URL harus dapat diakses dari backend/server grafana."
},
"docs-tip": {
- "visit-docs-for-more-details-here": ""
+ "visit-docs-for-more-details-here": "Kunjungi dokumen untuk detail selengkapnya di sini."
},
"exemplar-setting": {
"label-data-source": "Sumber data",
- "label-internal-link": "",
+ "label-internal-link": "Tautan internal",
"label-label-name": "Nama label",
- "label-remove-exemplar-link": "",
+ "label-remove-exemplar-link": "Hapus tautan contoh",
"label-url": "URL",
- "label-url-label": "",
- "placeholder-go-to-examplecom": "",
- "placeholder-httpsexamplecomvalueraw": "",
- "placeholder-trace-id": "",
- "title-remove-exemplar-link": "",
- "tooltip-data-source": "",
- "tooltip-internal-link": "",
- "tooltip-label-name": "",
- "tooltip-url": "",
- "tooltip-url-label": ""
+ "label-url-label": "Label URL",
+ "placeholder-go-to-examplecom": "Buka example.com",
+ "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
+ "placeholder-trace-id": "traceID",
+ "title-remove-exemplar-link": "Hapus tautan contoh",
+ "tooltip-data-source": "Sumber data yang akan dinavigasi oleh contoh.",
+ "tooltip-internal-link": "Aktifkan opsi ini jika Anda memiliki tautan internal. Saat diaktifkan, ini akan menampilkan selektor sumber data. Pilih penyimpanan data pelacakan backend untuk data contoh Anda.",
+ "tooltip-label-name": "Nama bidang dalam objek label yang harus digunakan untuk mendapatkan traceID.",
+ "tooltip-url": "URL backend jejak yang akan digunakan pengguna untuk melihat jejaknya",
+ "tooltip-url-label": "Gunakan untuk mengganti label tombol pada bidang traceID contoh."
},
"exemplars-settings": {
"add": "Tambahkan",
- "no-exemplars-configurations": "",
- "title-exemplars": ""
+ "no-exemplars-configurations": "Tidak ada konfigurasi contoh",
+ "title-exemplars": "Contoh"
},
"prom-settings": {
- "aria-label-default-editor": "",
- "aria-label-prom-type-type": "",
- "aria-label-prometheus-type": "",
- "aria-label-select-http-method": "",
+ "aria-label-default-editor": "Editor Default (Kode atau Pembuat)",
+ "aria-label-prom-type-type": "Jenis {{promType}}",
+ "aria-label-prometheus-type": "Jenis Prometheus",
+ "aria-label-select-http-method": "Pilih metode HTTP",
"editor-options": {
"label-builder": "",
"label-code": ""
},
- "label-cache-level": "",
- "label-custom-query-parameters": "",
- "label-default-editor": "",
- "label-disable-metrics-lookup": "",
- "label-disable-recording-rules-beta": "",
- "label-http-method": "",
- "label-incremental-querying-beta": "",
- "label-metric-names-suggestion-limit": "",
- "label-prom-type-version": "",
- "label-prometheus-type": "",
- "label-query-overlap-window": "",
- "label-query-timeout": "",
- "label-scrape-interval": "",
- "label-series-limit": "",
- "label-use-series-endpoint": "",
- "more-info": "",
- "placeholder-example-maxsourceresolutionmtimeout": "",
- "title-interval-behaviour": "",
- "title-other": "",
+ "label-cache-level": "Level cache",
+ "label-custom-query-parameters": "Parameter kueri kustom",
+ "label-default-editor": "Editor default",
+ "label-disable-metrics-lookup": "Nonaktifkan pencarian metrik",
+ "label-disable-recording-rules-beta": "Nonaktifkan aturan perekaman (beta)",
+ "label-http-method": "Metode HTTP",
+ "label-incremental-querying-beta": "Kueri inkremental (beta)",
+ "label-metric-names-suggestion-limit": "Batas saran nama metrik",
+ "label-prom-type-version": "Versi {{promType}}",
+ "label-prometheus-type": "Jenis Prometheus",
+ "label-query-overlap-window": "Jendela kueri tumpang tindih",
+ "label-query-timeout": "Batas waktu kueri habis",
+ "label-scrape-interval": "Interval scrape",
+ "label-series-limit": "Batas data seri",
+ "label-use-series-endpoint": "Gunakan titik akhir data seri",
+ "more-info": "Untuk informasi lengkap tentang mengonfigurasi jenis dan versi prometheus dalam sumber data, lihat <2>dokumentasi penyediaan2>.",
+ "placeholder-example-maxsourceresolutionmtimeout": "Contoh: {{example}}",
+ "title-interval-behaviour": "Perilaku interval",
+ "title-other": "Lainnya",
"title-performance": "Kinerja",
- "title-query-editor": "",
- "tooltip-cache-level": "",
- "tooltip-custom-query-parameters": "",
- "tooltip-default-editor": "",
- "tooltip-disable-metrics-lookup": "",
- "tooltip-disable-recording-rules-beta": "",
- "tooltip-http-method": "",
- "tooltip-incremental-querying-beta": "",
- "tooltip-metric-names-suggestion-limit": "",
- "tooltip-prom-type-version": "",
- "tooltip-prometheus-type": "",
- "tooltip-query-overlap-window": "",
- "tooltip-query-timeout": "",
- "tooltip-scrape-interval": "",
- "tooltip-series-limit": "",
- "tooltip-use-series-endpoint": ""
+ "title-query-editor": "Editor kueri",
+ "tooltip-cache-level": "Mengatur level cache peramban untuk kueri editor. Pengaturan cache yang lebih tinggi disarankan untuk sumber data dengan kardinalitas tinggi.",
+ "tooltip-custom-query-parameters": "Tambahkan parameter kustom ke URL kueri Prometheus. Misalnya {{example1}}, {{example2}}, {{example3}}, atau {{example4}}. Beberapa parameter harus digabungkan bersama dengan {{concatenationChar}}.",
+ "tooltip-default-editor": "Atur opsi editor default untuk semua pengguna sumber data ini.",
+ "tooltip-disable-metrics-lookup": "Memeriksa opsi ini akan menonaktifkan pemilih metrik dan dukungan metrik/label dalam pelengkapan otomatis bidang kueri. Ini membantu jika Anda memiliki masalah kinerja dengan instans Prometheus yang lebih besar. ",
+ "tooltip-disable-recording-rules-beta": "Fitur ini akan menonaktifkan aturan perekaman. Aktifkan ini untuk meningkatkan kinerja dasbor",
+ "tooltip-http-method": "Anda dapat menggunakan metode HTTP POST atau GET untuk melakukan kueri sumber data Prometheus Anda. POST adalah metode yang disarankan karena memungkinkan kueri yang lebih besar. Ubah ini menjadi GET jika Anda memiliki versi Prometheus yang lebih lama dari 2.1 atau jika permintaan POST dibatasi di jaringan Anda.",
+ "tooltip-incremental-querying-beta": "Fitur ini akan mengubah perilaku default kueri relatif: alih-alih selalu meminta data terbaru dari instans Prometheus, hasil kueri akan disimpan sementara, dan hanya data baru yang akan diminta. Aktifkan ini untuk mengurangi beban basis data dan jaringan.",
+ "tooltip-metric-names-suggestion-limit": "Jumlah maksimum nama metrik yang mungkin muncul sebagai saran pelengkapan otomatis dalam mode Kode editor kueri.",
+ "tooltip-prom-type-version": "Gunakan ini untuk mengatur versi instans {{promType}} Anda jika tidak dikonfigurasi secara otomatis.",
+ "tooltip-prometheus-type": "Atur ini ke jenis basis data prometheus Anda, misalnya Prometheus, Cortex, Mimir, atau Thanos. Mengubah bidang ini akan menyimpan pengaturan Anda saat ini. Jenis Prometheus tertentu mendukung atau tidak mendukung berbagai API. Misalnya, beberapa jenis mendukung pencocokan regex bagi kueri label untuk meningkatkan kinerja. Beberapa jenis memiliki API untuk metadata. Jika Anda mengatur ini secara tidak benar, Anda mungkin mengalami perilaku tidak biasa saat melakukan kueri metrik dan label. Periksa dokumentasi Prometheus Anda untuk memastikan Anda memasukkan jenis yang benar.",
+ "tooltip-query-overlap-window": "Tetapkan durasi seperti {{example1}} atau {{example2}} atau {{example3}}. Default {{default}}. Durasi ini akan ditambahkan ke durasi setiap permintaan tambahan.",
+ "tooltip-query-timeout": "Atur batas waktu kueri Prometheus.",
+ "tooltip-scrape-interval": "Interval ini adalah seberapa sering Prometheus melakukan scrape pada target. Atur ini ke interval scrape dan evaluasi umum yang dikonfigurasi dalam file konfigurasi Prometheus Anda. Jika Anda mengatur ini ke nilai yang lebih besar dari interval file konfigurasi Prometheus Anda, Grafana akan mengevaluasi data sesuai dengan interval ini dan Anda akan melihat lebih sedikit titik data. Default ke {{default}}.",
+ "tooltip-series-limit": "Batas ini berlaku untuk semua sumber daya (metrik, label, dan nilai) untuk kedua endpoint (deret dan label). Biarkan bidang kosong untuk menggunakan batas default (40000). Atur ke 0 untuk menonaktifkan batas dan mengambil semuanya — ini dapat menyebabkan masalah kinerja. Batas default adalah 40000.",
+ "tooltip-use-series-endpoint": "Memeriksa opsi ini akan mengutamakan titik akhir data seri dengan {{exampleParameter}} parameter daripada titik akhir nilai label dengan {{exampleParameter}} parameter. Meskipun titik akhir nilai label dianggap memiliki kinerja yang lebih baik, beberapa pengguna mungkin lebih menyukai data seri karena memiliki metode POST, sementara titik akhir nilai label hanya memiliki metode GET."
}
},
"prom-query-legend-editor": {
@@ -209,14 +209,111 @@
"label-verbose": ""
}
},
+ "promql": {
+ "getAggregationOptions": {
+ "documentation-avg": "",
+ "documentation-bottomk": "",
+ "documentation-count": "",
+ "documentation-count-values": "",
+ "documentation-group": "",
+ "documentation-max": "",
+ "documentation-min": "",
+ "documentation-quantile": "",
+ "documentation-stddev": "",
+ "documentation-stdvar": "",
+ "documentation-sum": "",
+ "documentation-topk": ""
+ },
+ "getFunctions": {
+ "documentation-abs": "",
+ "documentation-absent": "",
+ "documentation-absent-over-time": "",
+ "documentation-avg-over-time": "",
+ "documentation-ceil": "",
+ "documentation-changes": "",
+ "documentation-clamp": "",
+ "documentation-clamp-max": "",
+ "documentation-clamp-min": "",
+ "documentation-count-over-time": "",
+ "documentation-count-scalar": "",
+ "documentation-day-of-month": "",
+ "documentation-day-of-week": "",
+ "documentation-day-of-year": "",
+ "documentation-days-in-month": "",
+ "documentation-deg": "",
+ "documentation-delta": "",
+ "documentation-deriv": "",
+ "documentation-double-exponential-smoothing": "",
+ "documentation-drop-common-labels": "",
+ "documentation-exp": "",
+ "documentation-floor": "",
+ "documentation-histogram-avg": "",
+ "documentation-histogram-count": "",
+ "documentation-histogram-fraction": "",
+ "documentation-histogram-quantile": "",
+ "documentation-histogram-stddev": "",
+ "documentation-histogram-stdvar": "",
+ "documentation-histogram-sum": "",
+ "documentation-holt-winters": "",
+ "documentation-hour": "",
+ "documentation-idelta": "",
+ "documentation-increase": "",
+ "documentation-info": "",
+ "documentation-irate": "",
+ "documentation-label-join": "",
+ "documentation-label-replace": "",
+ "documentation-last-over-time": "",
+ "documentation-ln": "",
+ "documentation-log10": "",
+ "documentation-log2": "",
+ "documentation-max-over-time": "",
+ "documentation-min-over-time": "",
+ "documentation-minute": "",
+ "documentation-month": "",
+ "documentation-pi": "",
+ "documentation-predict-linear": "",
+ "documentation-present-over-time": "",
+ "documentation-quantile-over-time": "",
+ "documentation-rad": "",
+ "documentation-rate": "",
+ "documentation-resets": "",
+ "documentation-round": "",
+ "documentation-scalar": "",
+ "documentation-sgn": "",
+ "documentation-sort": "",
+ "documentation-sort-desc": "",
+ "documentation-sqrt": "",
+ "documentation-stddev-over-time": "",
+ "documentation-stdvar-over-time": "",
+ "documentation-sum-over-time": "",
+ "documentation-time": "",
+ "documentation-timestamp": "",
+ "documentation-vector": "",
+ "documentation-year": ""
+ },
+ "getTrigonometricFunctions": {
+ "documentation-acos": "",
+ "documentation-acosh": "",
+ "documentation-asin": "",
+ "documentation-asinh": "",
+ "documentation-atan": "",
+ "documentation-atanh": "",
+ "documentation-cos": "",
+ "documentation-cosh": "",
+ "documentation-sin": "",
+ "documentation-sinh": "",
+ "documentation-tan": "",
+ "documentation-tanh": ""
+ }
+ },
"querybuilder": {
"additional-settings": {
- "content-filter-metric-names-regex-search-using": "",
- "disable-text-wrap": ""
+ "content-filter-metric-names-regex-search-using": "Filter nama metrik dengan pencarian regex, menggunakan panggilan tambahan pada API Prometheus.",
+ "disable-text-wrap": "Nonaktifkan pemenggalan teks otomatis"
},
"feedback-link": {
"give-feedback": "Berikan umpan balik",
- "title-give-feedback": ""
+ "title-give-feedback": "Penjelajah metrik ini masih baru, beri tahu kami cara untuk meningkatkannya"
},
"get-collapsed-info": {
"exemplars": "",
@@ -250,18 +347,18 @@
},
"handle-function": {
"text": {
- "query-parsing-is-ambiguous": ""
+ "query-parsing-is-ambiguous": "Penguraian kueri mengalami masalah ketidakjelasan."
}
},
"label-filter-item": {
- "aria-label-remove": "",
- "placeholder-select-label": "",
+ "aria-label-remove": "Hapus {{name}}",
+ "placeholder-select-label": "Pilih label",
"placeholder-select-value": "Pilih nilai"
},
"label-filters": {
- "label-filters": "",
- "label-label-filters": "",
- "tooltip-label-filters": ""
+ "label-filters": "Filter label",
+ "label-label-filters": "Filter label",
+ "tooltip-label-filters": "Opsional: digunakan untuk menyaring metrik yang dipilih untuk jenis kueri ini."
},
"label-param-editor": {
"loadingMessage-loading-labels": "",
@@ -269,91 +366,98 @@
},
"metric-combobox": {
"async-select": {
- "aria-label-open-metrics-explorer": "",
- "placeholder-select-metric": "",
- "tooltip-open-metrics-explorer": ""
+ "aria-label-open-metrics-explorer": "Buka penjelajah metrik",
+ "placeholder-select-metric": "Pilih metrik",
+ "tooltip-open-metrics-explorer": "Buka penjelajah metrik"
},
"label-metric": "Metrik",
- "tooltip-metric": ""
+ "tooltip-metric": "Opsional: mengembalikan daftar nilai label untuk nama label dalam metrik yang ditentukan."
},
"metrics-modal": {
- "additional-settings": "",
+ "additional-settings": "Pengaturan Tambahan",
"aria-label-additional-settings": "Pengaturan tambahan",
- "aria-label-browse-metrics": "",
- "currently-selected": "",
- "metrics-pre-filtered": "",
- "placeholder-results-per-page": "",
- "results-per-page": "",
- "title-metrics-explorer": "",
- "results-amount_other": ""
+ "aria-label-browse-metrics": "Telusuri metrik",
+ "currently-selected": "Sedang dipilih: {{selected}}",
+ "metrics-pre-filtered": "Metrik ini telah difilter sebelumnya berdasarkan label yang dipilih di filter label.",
+ "placeholder-results-per-page": "hasil per halaman",
+ "results-per-page": "Hasil per halaman",
+ "title-metrics-explorer": "Penjelajah metrik",
+ "results-amount_other": "Menampilkan {{num}} dari {{count}} hasil"
},
"nested-query": {
"label": {
- "ignoring": "",
+ "ignoring": "Mengabaikan",
"on": "Aktif"
},
"operator": "Operator",
- "tooltip-remove-match": "",
- "vector-matches": ""
+ "tooltip-remove-match": "Hapus kecocokan",
+ "vector-matches": "Kecocokan vektor"
},
"operation-editor": {
- "not-found": "",
- "title-remove": ""
+ "not-found": "Operasi {{id}} tidak ditemukan",
+ "title-remove": "Hapus {{name}}"
},
"operation-header": {
"placeholder-replace-with": "Ganti dengan",
- "title-click-to-view-alternative-operations": "",
- "title-remove-operation": ""
+ "title-click-to-view-alternative-operations": "Klik untuk melihat operasi alternatif",
+ "title-remove-operation": "Hapus operasi"
},
"operation-info-button": {
- "title-click-to-show-description": "",
- "title-remove-operation": ""
+ "title-click-to-show-description": "Klik untuk menampilkan deskripsi",
+ "title-remove-operation": "Hapus operasi"
},
"operation-list": {
- "operations": "",
+ "operations": "Operasi",
"placeholder-search": "Cari",
- "title-add-operation": ""
+ "title-add-operation": "Tambah operasi"
},
"operation-param-editor": {
- "title-add": "",
- "title-remove": ""
+ "title-add": "Tambahkan {{name}}",
+ "title-remove": "Hapus {{name}}"
+ },
+ "operation-utils": {
+ "getAggregationExplainer": {
+ "label-by": "",
+ "label-default": "",
+ "label-without": ""
+ }
},
"prom-query-builder-options": {
- "aria-label-lower-limit-parameter": "",
- "aria-label-select-resolution": "",
+ "aria-label-lower-limit-parameter": "Tetapkan batas bawah untuk parameter langkah",
+ "aria-label-select-resolution": "Pilih resolusi",
"format-options": {
"label-heatmap": "",
"label-table": "",
"label-time-series": ""
},
- "label-exemplars": "",
+ "label-exemplars": "Contoh",
"label-format": "Format",
- "label-min-step": "",
- "label-resolution": "",
+ "label-min-step": "Langkah minimum",
+ "label-resolution": "Resolusi",
"label-type": "Jenis",
- "placeholder-auto": "",
+ "placeholder-auto": "auto",
"title-options": "Opsi",
- "tooltip-min-step": ""
+ "tooltip-min-step": "Batas bawah tambahan untuk parameter langkah kueri Prometheus dan untuk variabel <2>{{interval}}2> dan <4>{{rateInterval}}4>."
},
"prom-query-code-editor-autocomplete-info": {
- "autocomplete-suggestions-limited": "",
- "tooltip-autocomplete-suggestions-limited": ""
+ "autocomplete-suggestions-limited": "Saran pelengkapan otomatis dibatasi",
+ "tooltip-autocomplete-suggestions-limited": "Jumlah nama metrik melebihi batas pelengkapan otomatis. Hanya {{autocompleteLimit}} metrik yang paling relevan yang ditampilkan. Anda dapat menyesuaikan ambang batas dalam pengaturan sumber data."
},
"prom-query-editor-selector": {
"body-syntax-error": "",
"confirmText-continue": "",
"kick-start-your-query": "Mulai kueri Anda",
- "label-explain": "",
- "run-queries": "",
- "title-parsing-error-switch-builder": ""
+ "label-explain": "Penjelasan",
+ "run-queries": "Jalankan kueri",
+ "title-parsing-error-switch-builder": "Terjadi kesalahan penguraian: Beralih ke mode pembuat?"
},
"prom-query-legend-editor": {
- "label-legend": "",
- "placeholder-select-legend-mode": "",
- "tooltip-legend": ""
+ "label-legend": "Legenda",
+ "placeholder-select-legend-mode": "Pilih mode legenda",
+ "tooltip-legend": "Mengganti nama seri atau templat. Misalnya, {{templateExample}} akan diganti dengan nilai label untuk {{labelName}}."
},
"query-builder-hints": {
- "hint-details": ""
+ "hint-details": "petunjuk: {{hintDetails}}"
},
"query-editor-mode-toggle": {
"editor-modes": {
@@ -362,30 +466,30 @@
}
},
"query-pattern": {
- "apply-query": "",
- "aria-label-apply-query-starter-button": "",
- "aria-label-back-button": "",
- "aria-label-create-new-query-button": "",
- "aria-label-raw-query": "",
- "aria-label-use-this-query-button": "",
+ "apply-query": "Terapkan kueri",
+ "aria-label-apply-query-starter-button": "tombol mulai terapkan kueri",
+ "aria-label-back-button": "tombol kembali",
+ "aria-label-create-new-query-button": "tombol buat kueri baru",
+ "aria-label-raw-query": "Kueri {{patternName}} mentah",
+ "aria-label-use-this-query-button": "tombol gunakan kueri ini",
"back": "Kembali",
- "create-new-query": "",
+ "create-new-query": "Buat kueri baru",
"use-this-query": "Gunakan kueri ini"
},
"query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "",
+ "aria-label-close-kick-start-your-query-modal": "tutup modal untuk memulai kueri Anda",
"aria-label-kick-start-your-query-modal": "Mulai modal kueri Anda",
- "aria-label-toggle-query-starter": "",
+ "aria-label-toggle-query-starter": "buka dan tutup kartu pemula kueri {{patternType}}",
"close": "Tutup",
- "description-kick-start-your-query": "",
- "label-toggle-query-starter": "",
+ "description-kick-start-your-query": "Mulai kueri Anda dengan memilih salah satu kueri ini. Anda kemudian dapat melanjutkan untuk menyelesaikan kueri Anda.",
+ "label-toggle-query-starter": "kueri awal {{patternType}}",
"title-kick-start-your-query": "Mulai kueri Anda"
},
"raw-query": {
- "aria-label-selector": ""
+ "aria-label-selector": "selektor"
},
"results-table": {
- "content-descriptive-type": "",
+ "content-descriptive-type": "Saat membuat {{descriptiveType}}, Prometheus mengekspos beberapa data seri dengan penghitung jenis. ",
"description": "Deskripsi",
"message-expand-label-filters": "",
"message-expand-search": "",
@@ -396,7 +500,7 @@
},
"update-function-args": {
"text": {
- "query-parsing-is-ambiguous": ""
+ "query-parsing-is-ambiguous": "Penguraian kueri mengalami masalah ketidakjelasan."
}
}
}
diff --git a/packages/grafana-prometheus/src/locales/it-IT/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/it-IT/grafana-prometheus.json
index 44db96a498b..443fd697bad 100644
--- a/packages/grafana-prometheus/src/locales/it-IT/grafana-prometheus.json
+++ b/packages/grafana-prometheus/src/locales/it-IT/grafana-prometheus.json
@@ -209,6 +209,103 @@
"label-verbose": ""
}
},
+ "promql": {
+ "getAggregationOptions": {
+ "documentation-avg": "",
+ "documentation-bottomk": "",
+ "documentation-count": "",
+ "documentation-count-values": "",
+ "documentation-group": "",
+ "documentation-max": "",
+ "documentation-min": "",
+ "documentation-quantile": "",
+ "documentation-stddev": "",
+ "documentation-stdvar": "",
+ "documentation-sum": "",
+ "documentation-topk": ""
+ },
+ "getFunctions": {
+ "documentation-abs": "",
+ "documentation-absent": "",
+ "documentation-absent-over-time": "",
+ "documentation-avg-over-time": "",
+ "documentation-ceil": "",
+ "documentation-changes": "",
+ "documentation-clamp": "",
+ "documentation-clamp-max": "",
+ "documentation-clamp-min": "",
+ "documentation-count-over-time": "",
+ "documentation-count-scalar": "",
+ "documentation-day-of-month": "",
+ "documentation-day-of-week": "",
+ "documentation-day-of-year": "",
+ "documentation-days-in-month": "",
+ "documentation-deg": "",
+ "documentation-delta": "",
+ "documentation-deriv": "",
+ "documentation-double-exponential-smoothing": "",
+ "documentation-drop-common-labels": "",
+ "documentation-exp": "",
+ "documentation-floor": "",
+ "documentation-histogram-avg": "",
+ "documentation-histogram-count": "",
+ "documentation-histogram-fraction": "",
+ "documentation-histogram-quantile": "",
+ "documentation-histogram-stddev": "",
+ "documentation-histogram-stdvar": "",
+ "documentation-histogram-sum": "",
+ "documentation-holt-winters": "",
+ "documentation-hour": "",
+ "documentation-idelta": "",
+ "documentation-increase": "",
+ "documentation-info": "",
+ "documentation-irate": "",
+ "documentation-label-join": "",
+ "documentation-label-replace": "",
+ "documentation-last-over-time": "",
+ "documentation-ln": "",
+ "documentation-log10": "",
+ "documentation-log2": "",
+ "documentation-max-over-time": "",
+ "documentation-min-over-time": "",
+ "documentation-minute": "",
+ "documentation-month": "",
+ "documentation-pi": "",
+ "documentation-predict-linear": "",
+ "documentation-present-over-time": "",
+ "documentation-quantile-over-time": "",
+ "documentation-rad": "",
+ "documentation-rate": "",
+ "documentation-resets": "",
+ "documentation-round": "",
+ "documentation-scalar": "",
+ "documentation-sgn": "",
+ "documentation-sort": "",
+ "documentation-sort-desc": "",
+ "documentation-sqrt": "",
+ "documentation-stddev-over-time": "",
+ "documentation-stdvar-over-time": "",
+ "documentation-sum-over-time": "",
+ "documentation-time": "",
+ "documentation-timestamp": "",
+ "documentation-vector": "",
+ "documentation-year": ""
+ },
+ "getTrigonometricFunctions": {
+ "documentation-acos": "",
+ "documentation-acosh": "",
+ "documentation-asin": "",
+ "documentation-asinh": "",
+ "documentation-atan": "",
+ "documentation-atanh": "",
+ "documentation-cos": "",
+ "documentation-cosh": "",
+ "documentation-sin": "",
+ "documentation-sinh": "",
+ "documentation-tan": "",
+ "documentation-tanh": ""
+ }
+ },
"querybuilder": {
"additional-settings": {
"content-filter-metric-names-regex-search-using": "",
@@ -319,6 +416,13 @@
"title-add": "",
"title-remove": ""
},
+ "operation-utils": {
+ "getAggregationExplainer": {
+ "label-by": "",
+ "label-default": "",
+ "label-without": ""
+ }
+ },
"prom-query-builder-options": {
"aria-label-lower-limit-parameter": "",
"aria-label-select-resolution": "",
diff --git a/packages/grafana-prometheus/src/locales/ja-JP/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/ja-JP/grafana-prometheus.json
index 13c91887eab..962ded0d7be 100644
--- a/packages/grafana-prometheus/src/locales/ja-JP/grafana-prometheus.json
+++ b/packages/grafana-prometheus/src/locales/ja-JP/grafana-prometheus.json
@@ -2,201 +2,201 @@
"grafana-prometheus": {
"components": {
"annotation-query-editor": {
- "annotation-data-load-error": "",
- "aria-label-lower-limit-parameter": "",
- "label-min-step": "",
- "label-series-value-as-timestamp": "",
+ "annotation-data-load-error": "注釈データの読み込みエラー!",
+ "aria-label-lower-limit-parameter": "ステップパラメーターの下限を設定",
+ "label-min-step": "最小ステップ",
+ "label-series-value-as-timestamp": "タイムスタンプとしての系列値",
"label-tags": "タグ",
- "label-text": "",
+ "label-text": "テキスト",
"label-title": "タイトル",
- "placeholder-auto": "",
- "tooltip-either-pattern-example-instance-replaced-label": "",
- "tooltip-min-step": "",
- "tooltip-timestamp-milliseconds-series-value-seconds-multiply": ""
+ "placeholder-auto": "自動",
+ "tooltip-either-pattern-example-instance-replaced-label": "名前またはパターンのいずれかを使用します。例えば、{{labelTemplate}}はラベル{{labelName}}のラベル値に置き換えられます。",
+ "tooltip-min-step": "Prometheusクエリのステップパラメーターと<2>{{intervalVar}}2>および<4>{{rateIntervalVar}}4>変数の追加下限。",
+ "tooltip-timestamp-milliseconds-series-value-seconds-multiply": "タイムスタンプの単位はミリ秒です。系列値の単位が秒の場合、その範囲ベクトルに1000を掛けます。"
},
"get-query-type-options": {
"description": {
- "instant-query-range": ""
+ "instant-query-range": "インスタントクエリと範囲クエリを実行"
},
"label": {
- "both": ""
+ "both": "両方"
},
"range-options": {
"description": {
- "query-range": ""
+ "query-range": "時間範囲にわたってクエリを実行"
},
"label": {
- "instant": "",
- "range": ""
+ "instant": "インスタント",
+ "range": "範囲"
}
}
},
"label-selector": {
- "aria-label-filter-expression-for-label": "",
- "description-select-labels": "",
- "select-labels-to-search-in": ""
+ "aria-label-filter-expression-for-label": "ラベルのフィルター式",
+ "description-select-labels": "ラベル値を選択すると、可能なラベルの組み合わせのみが表示されます。",
+ "select-labels-to-search-in": "2. 検索するラベルを選択"
},
"metric-selector": {
- "aria-label-filter-expression-for-metric": "",
- "aria-label-limit-results-from-series-endpoint": "",
- "description-series-limit": "",
- "label-select-metric": "",
- "select-a-metric": "",
- "series-limit": ""
+ "aria-label-filter-expression-for-metric": "メトリックのフィルター式",
+ "aria-label-limit-results-from-series-endpoint": "系列エンドポイントからの結果を制限",
+ "description-series-limit": "制限はすべてのメトリック、ラベル、値に適用されます。デフォルトの制限を使用するには、フィールドを空のままにしてください。制限を無効にしてすべてを取得するには0に設定します。これによりパフォーマンスの問題が発生する可能性があります。",
+ "label-select-metric": "メトリックを選択すると、可能なラベルのみが表示されます。ラベルには以下の系列制限が適用されます。",
+ "select-a-metric": "メトリックを選択",
+ "series-limit": "系列制限"
},
"prom-cheat-sheet": {
- "prom-ql-cheat-sheet": ""
+ "prom-ql-cheat-sheet": "PromQLチートシート"
},
"prom-exemplar-field": {
- "exemplars": "",
- "tooltip-disable-query": "",
- "tooltip-enable-query": ""
+ "exemplars": "エグゼンプラー",
+ "tooltip-disable-query": "エグゼンプラーを使用したクエリを無効化",
+ "tooltip-enable-query": "エグゼンプラーを使用したクエリを有効化"
},
"prom-explore-extra-field": {
- "aria-label-prometheus-extra-field": "",
- "aria-label-query-type-field": "",
- "aria-label-step-field": "",
- "min-step": "",
- "query-type": "",
- "tooltip-units-builtin-variables-example-interval-rateinterval": ""
+ "aria-label-prometheus-extra-field": "Prometheus追加フィールド",
+ "aria-label-query-type-field": "クエリタイプフィールド",
+ "aria-label-step-field": "ステップフィールド",
+ "min-step": "最小ステップ",
+ "query-type": "クエリタイプ",
+ "tooltip-units-builtin-variables-example-interval-rateinterval": "ここでは時間単位と組み込み変数を使用できます。例: {{example1}}、{{example2}}、{{example3}}、{{example4}}、{{example5}}、{{example6}}、{{example7}}(単位が指定されていない場合のデフォルト: {{default}})"
},
"prom-query-field": {
- "placeholder-enter-a-prom-ql-query": ""
+ "placeholder-enter-a-prom-ql-query": "PromQLクエリを入力…"
},
"prom-variable-query-editor": {
- "aria-label-classic-query": "",
- "aria-label-metric-regex": "",
- "aria-label-metric-selector": "",
- "aria-label-prometheus-query": "",
- "aria-label-query-type": "",
- "aria-label-series-query": "",
- "label-classic-query": "",
+ "aria-label-classic-query": "クラシッククエリ",
+ "aria-label-metric-regex": "メトリック正規表現",
+ "aria-label-metric-selector": "メトリックセレクター",
+ "aria-label-prometheus-query": "Prometheusクエリ",
+ "aria-label-query-type": "クエリタイプ",
+ "aria-label-series-query": "系列クエリ",
+ "label-classic-query": "クラシッククエリ",
"label-label": "ラベル",
- "label-metric-regex": "",
+ "label-metric-regex": "メトリック正規表現",
"label-query": "クエリ",
- "label-query-type": "",
- "label-series-query": "",
- "placeholder-classic-query": "",
- "placeholder-metric-regex": "",
- "placeholder-prometheus-query": "",
+ "label-query-type": "クエリタイプ",
+ "label-series-query": "系列クエリ",
+ "placeholder-classic-query": "クラシッククエリ",
+ "placeholder-metric-regex": "メトリック正規表現",
+ "placeholder-prometheus-query": "Prometheusクエリ",
"placeholder-select-query-type": "クエリタイプを選択",
- "placeholder-series-query": "",
- "returns-metrics-matching-specified-metric-regex": "",
- "tooltip-classic-query": "",
- "tooltip-label": "",
- "tooltip-metric-regex": "",
- "tooltip-query": "",
- "tooltip-query-type": "",
- "tooltip-series-query": ""
+ "placeholder-series-query": "系列クエリ",
+ "returns-metrics-matching-specified-metric-regex": "指定された正規表現に一致するメトリックのリストを返します。",
+ "tooltip-classic-query": "Prometheus変数クエリエディターの元の実装。これらのドキュメントに記載されているように、正しいクエリタイプとパラメーターを含む文字列を入力してください。例: {{exampleQuery}}。",
+ "tooltip-label": "メトリックが指定されていない限り、すべてのメトリックのラベル名に対するラベル値のリストを返します。",
+ "tooltip-metric-regex": "ラベル名のリストを返します。オプションで、指定されたメトリック正規表現でフィルタリングすることも可能です。",
+ "tooltip-query": "クエリのPrometheusクエリ結果のリストを返します。これには、Prometheus関数を含めることもできます。例: {{exampleQuery}}。",
+ "tooltip-query-type": "Prometheusデータソースプラグインは、テンプレート変数に以下のクエリタイプを入力します。",
+ "tooltip-series-query": "ラベル付きメトリック、メトリックのみ、またはラベルのみを入力します。例: {{example1}}、{{example2}}、または{{example3}}。入力されたデータに関連する時系列のリストを返します。"
},
"selector-actions": {
- "aria-label-selector": "",
- "aria-label-selector-clear-button": "",
- "aria-label-use-selector-as-metrics-button": "",
- "aria-label-use-selector-for-query-button": "",
- "aria-label-validate-submit-button": "",
+ "aria-label-selector": "セレクター",
+ "aria-label-selector-clear-button": "セレクタークリアボタン",
+ "aria-label-use-selector-as-metrics-button": "メトリックボタンにセレクターを使用",
+ "aria-label-use-selector-for-query-button": "クエリボタンにセレクターを使用",
+ "aria-label-validate-submit-button": "送信ボタンを検証",
"clear": "消去",
- "resulting-selector": "",
- "use-as-rate-query": "",
- "use-query": "",
- "validate-selector": ""
+ "resulting-selector": "4. 結果セレクター",
+ "use-as-rate-query": "レートクエリとして使用",
+ "use-query": "このクエリを使用",
+ "validate-selector": "セレクターを検証"
},
"value-selector": {
- "aria-label-filter-expression-for-label-values": "",
- "aria-label-values-for": "",
- "description-search-field-values-across-selected-labels": "",
- "select-multiple-values-for-your-labels": ""
+ "aria-label-filter-expression-for-label-values": "ラベル値のフィルター式",
+ "aria-label-values-for": "{{labelKey}}の値",
+ "description-search-field-values-across-selected-labels": "検索フィールドを使用して選択したラベル全体の値を検索します。",
+ "select-multiple-values-for-your-labels": "3. ラベルの値を(複数)選択"
}
},
"configuration": {
"alerting-settings-overhaul": {
- "label-allow-as-recording-rules-target": "",
- "label-manage-alerts-via-alerting-ui": "",
+ "label-allow-as-recording-rules-target": "記録ルールのターゲットとして許可",
+ "label-manage-alerts-via-alerting-ui": "アラートUIでアラートを管理",
"title-alerting": "アラート",
- "tooltip-allow-as-recording-rules-target": "",
+ "tooltip-allow-as-recording-rules-target": "このデータソースを記録ルール書き込みのターゲットとして選択できるようにします。",
"tooltip-manage-alerts-via-alerting-ui": "このデータソースのアラートルールを管理します。他のアラートリソースを管理するには、Alertmanagerデータソースを追加します。"
},
"config-editor": {
- "browser-access-mode-error": "",
- "description-advanced-settings": "",
+ "browser-access-mode-error": "Prometheusデータソースのブラウザアクセスモードは利用できなくなりました。サーバーアクセスモードに切り替えてください。",
+ "description-advanced-settings": "追加設定は、データソースをより詳細に制御するために指定できるオプション設定です。",
"title-advanced-settings": "詳細設定",
"title-error": "エラー"
},
"data-source-http-settings-overhaul": {
"tooltip-browser-access-mode": "アクセス方法は<1>ブラウザ1>です。つまり、URLにブラウザからアクセスできる必要があります。",
- "tooltip-http-url": "",
+ "tooltip-http-url": "完全なHTTP URLを指定してください(例: {{exampleURL}})",
"tooltip-server-access-mode": "アクセス方法は<1>サーバー1>です。つまり、URLにGrafanaバックエンド/サーバーからアクセスできる必要があります。"
},
"docs-tip": {
- "visit-docs-for-more-details-here": ""
+ "visit-docs-for-more-details-here": "詳細についてはこちらのドキュメントをご覧ください。"
},
"exemplar-setting": {
"label-data-source": "データソース",
- "label-internal-link": "",
+ "label-internal-link": "内部リンク",
"label-label-name": "ラベル名",
- "label-remove-exemplar-link": "",
+ "label-remove-exemplar-link": "エグゼンプラーリンクを削除",
"label-url": "URL",
- "label-url-label": "",
- "placeholder-go-to-examplecom": "",
- "placeholder-httpsexamplecomvalueraw": "",
- "placeholder-trace-id": "",
- "title-remove-exemplar-link": "",
- "tooltip-data-source": "",
- "tooltip-internal-link": "",
- "tooltip-label-name": "",
- "tooltip-url": "",
- "tooltip-url-label": ""
+ "label-url-label": "URLラベル",
+ "placeholder-go-to-examplecom": "example.comに移動",
+ "placeholder-httpsexamplecomvalueraw": "https://example.com/${__value.raw}",
+ "placeholder-trace-id": "traceID",
+ "title-remove-exemplar-link": "エグゼンプラーリンクを削除",
+ "tooltip-data-source": "エグゼンプラーによる移動先のデータソース。",
+ "tooltip-internal-link": "内部リンクがある場合は、このオプションを有効にしてください。有効にすると、データソースセレクターが表示されます。エグゼンプラーデータのバックエンドトレーシングデータストアを選択してください。",
+ "tooltip-label-name": "traceIDを取得するために使用されるラベルオブジェクト内のフィールド名。",
+ "tooltip-url": "ユーザーがトレースを確認するためにアクセスするトレースバックエンドのURL",
+ "tooltip-url-label": "エグゼンプラーのtraceIDフィールドのボタンラベルを上書きするために使用します。"
},
"exemplars-settings": {
"add": "追加",
- "no-exemplars-configurations": "",
- "title-exemplars": ""
+ "no-exemplars-configurations": "エグゼンプラー設定がありません",
+ "title-exemplars": "エグゼンプラー"
},
"prom-settings": {
- "aria-label-default-editor": "",
- "aria-label-prom-type-type": "",
- "aria-label-prometheus-type": "",
- "aria-label-select-http-method": "",
+ "aria-label-default-editor": "デフォルトエディター(コードまたはビルダー)",
+ "aria-label-prom-type-type": "{{promType}}タイプ",
+ "aria-label-prometheus-type": "Prometheusタイプ",
+ "aria-label-select-http-method": "HTTPメソッドを選択",
"editor-options": {
"label-builder": "",
"label-code": ""
},
- "label-cache-level": "",
- "label-custom-query-parameters": "",
- "label-default-editor": "",
- "label-disable-metrics-lookup": "",
- "label-disable-recording-rules-beta": "",
- "label-http-method": "",
- "label-incremental-querying-beta": "",
- "label-metric-names-suggestion-limit": "",
- "label-prom-type-version": "",
- "label-prometheus-type": "",
- "label-query-overlap-window": "",
- "label-query-timeout": "",
- "label-scrape-interval": "",
- "label-series-limit": "",
- "label-use-series-endpoint": "",
- "more-info": "",
- "placeholder-example-maxsourceresolutionmtimeout": "",
- "title-interval-behaviour": "",
- "title-other": "",
+ "label-cache-level": "キャッシュレベル",
+ "label-custom-query-parameters": "カスタムクエリパラメーター",
+ "label-default-editor": "デフォルトエディター",
+ "label-disable-metrics-lookup": "メトリック検索を無効化",
+ "label-disable-recording-rules-beta": "記録ルールを無効化(ベータ版)",
+ "label-http-method": "HTTPメソッド",
+ "label-incremental-querying-beta": "増分クエリ(ベータ版)",
+ "label-metric-names-suggestion-limit": "メトリック名提案制限",
+ "label-prom-type-version": "{{promType}}バージョン",
+ "label-prometheus-type": "Prometheusタイプ",
+ "label-query-overlap-window": "クエリ重複ウィンドウ",
+ "label-query-timeout": "クエリタイムアウト",
+ "label-scrape-interval": "スクレイプ間隔",
+ "label-series-limit": "系列制限",
+ "label-use-series-endpoint": "系列エンドポイントを使用",
+ "more-info": "データソースでのPrometheusタイプとバージョンの設定の詳細については、<2>プロビジョニングドキュメント2>をご覧ください。",
+ "placeholder-example-maxsourceresolutionmtimeout": "例: {{example}}",
+ "title-interval-behaviour": "間隔の動作",
+ "title-other": "その他",
"title-performance": "パフォーマンス",
- "title-query-editor": "",
- "tooltip-cache-level": "",
- "tooltip-custom-query-parameters": "",
- "tooltip-default-editor": "",
- "tooltip-disable-metrics-lookup": "",
- "tooltip-disable-recording-rules-beta": "",
- "tooltip-http-method": "",
- "tooltip-incremental-querying-beta": "",
- "tooltip-metric-names-suggestion-limit": "",
- "tooltip-prom-type-version": "",
- "tooltip-prometheus-type": "",
- "tooltip-query-overlap-window": "",
- "tooltip-query-timeout": "",
- "tooltip-scrape-interval": "",
- "tooltip-series-limit": "",
- "tooltip-use-series-endpoint": ""
+ "title-query-editor": "クエリエディター",
+ "tooltip-cache-level": "エディタークエリのブラウザーキャッシュレベルを設定します。高カーディナリティデータソースには、より高いキャッシュ設定を推奨します。",
+ "tooltip-custom-query-parameters": "PrometheusクエリURLにカスタムパラメーターを追加します。例: {{example1}}、{{example2}}、{{example3}}、または{{example4}}。複数のパラメーターは{{concatenationChar}}で連結する必要があります。",
+ "tooltip-default-editor": "このデータソースのすべてのユーザーにデフォルトエディターオプションを設定します。",
+ "tooltip-disable-metrics-lookup": "このオプションをオンにすると、クエリフィールドのオートコンプリートでメトリック選択とメトリック/ラベルサポートが無効になります。これは、大規模なPrometheusインスタンスをご利用でパフォーマンスの問題がある場合に役立ちます。",
+ "tooltip-disable-recording-rules-beta": "この機能は記録ルールを無効にします。ダッシュボードのパフォーマンスを向上させるには、この機能をオンにしてください",
+ "tooltip-http-method": "PrometheusデータソースをクエリするにはPOSTまたはGET HTTPメソッドのいずれかを使用できます。POSTメソッドだと、より大きなクエリを実行できるため、推奨される方法です。Prometheusのバージョンが2.1より古い場合、またはネットワークでPOSTリクエストが制限されている場合は、これをGETに変更してください。",
+ "tooltip-incremental-querying-beta": "この機能は相対クエリのデフォルト動作が変更され、常にPrometheusインスタンスから新しいデータをリクエストする代わりに、クエリ結果をキャッシュして新しいレコードのみをリクエストするようになります。データベースとネットワークの負荷を軽減するには、これをオンにしてください。",
+ "tooltip-metric-names-suggestion-limit": "クエリエディターのコードモードでオートコンプリート候補として表示される可能性のあるメトリック名の最大数。",
+ "tooltip-prom-type-version": "自動設定されていない場合、これを使用して{{promType}}インスタンスのバージョンを設定してください。",
+ "tooltip-prometheus-type": "Prometheus、Cortex、Mimir、Thanosなど、Prometheusデータベースのタイプに設定してください。このフィールドを変更すると、現在の設定が保存されます。一部のPrometheusのタイプでは、さまざまなAPIがサポートされているか、またはサポートされていない場合があります。例えば、一部のタイプではパフォーマンス向上のためにラベルクエリの正規表現マッチングをサポートしています。また、タイプによってはメタデータ用のAPIがあります。これを正しく設定しないと、メトリックとラベルのクエリ時に異常な動作が発生する可能性があります。正しいタイプを入力するために、Prometheusのドキュメントを確認してください。",
+ "tooltip-query-overlap-window": "{{example1}}や{{example2}}または{{example3}}のような期間を設定してください。デフォルトは{{default}}です。この期間は、各増分リクエストの期間に追加されます。",
+ "tooltip-query-timeout": "Prometheusクエリタイムアウトを設定します。",
+ "tooltip-scrape-interval": "この間隔は、Prometheusがターゲットをスクレイプする頻度です。Prometheus設定ファイルで指定された一般的なスクレイプと評価間隔に設定してください。これをPrometheus設定ファイルの間隔より大きな値に設定すると、Grafanaはこの間隔に従ってデータを評価するため、データポイントが少なくなります。デフォルトは{{default}}です。",
+ "tooltip-series-limit": "制限は両方のエンドポイント(系列とラベル)のすべてのリソース(メトリック、ラベル、値)に適用されます。デフォルトの制限(40000)を使用するには、フィールドを空のままにしてください。制限を無効にしてすべてを取得するには0に設定します。これによりパフォーマンスの問題が発生する可能性があります。デフォルトの制限は40000です。",
+ "tooltip-use-series-endpoint": "このオプションをオンにすると、{{exampleParameter}}パラメーターを持つラベル値エンドポイントより、{{exampleParameter}}パラメーターを持つ系列エンドポイントが優先されます。ラベル値エンドポイントの方がパフォーマンスが高いと考えられていますが、ラベル値エンドポイントにはGETメソッドしかないのに対し、系列にはPOSTメソッドがあるため、系列を好むユーザーもいます。"
}
},
"prom-query-legend-editor": {
@@ -209,14 +209,111 @@
"label-verbose": ""
}
},
+ "promql": {
+ "getAggregationOptions": {
+ "documentation-avg": "",
+ "documentation-bottomk": "",
+ "documentation-count": "",
+ "documentation-count-values": "",
+ "documentation-group": "",
+ "documentation-max": "",
+ "documentation-min": "",
+ "documentation-quantile": "",
+ "documentation-stddev": "",
+ "documentation-stdvar": "",
+ "documentation-sum": "",
+ "documentation-topk": ""
+ },
+ "getFunctions": {
+ "documentation-abs": "",
+ "documentation-absent": "",
+ "documentation-absent-over-time": "",
+ "documentation-avg-over-time": "",
+ "documentation-ceil": "",
+ "documentation-changes": "",
+ "documentation-clamp": "",
+ "documentation-clamp-max": "",
+ "documentation-clamp-min": "",
+ "documentation-count-over-time": "",
+ "documentation-count-scalar": "",
+ "documentation-day-of-month": "",
+ "documentation-day-of-week": "",
+ "documentation-day-of-year": "",
+ "documentation-days-in-month": "",
+ "documentation-deg": "",
+ "documentation-delta": "",
+ "documentation-deriv": "",
+ "documentation-double-exponential-smoothing": "",
+ "documentation-drop-common-labels": "",
+ "documentation-exp": "",
+ "documentation-floor": "",
+ "documentation-histogram-avg": "",
+ "documentation-histogram-count": "",
+ "documentation-histogram-fraction": "",
+ "documentation-histogram-quantile": "",
+ "documentation-histogram-stddev": "",
+ "documentation-histogram-stdvar": "",
+ "documentation-histogram-sum": "",
+ "documentation-holt-winters": "",
+ "documentation-hour": "",
+ "documentation-idelta": "",
+ "documentation-increase": "",
+ "documentation-info": "",
+ "documentation-irate": "",
+ "documentation-label-join": "",
+ "documentation-label-replace": "",
+ "documentation-last-over-time": "",
+ "documentation-ln": "",
+ "documentation-log10": "",
+ "documentation-log2": "",
+ "documentation-max-over-time": "",
+ "documentation-min-over-time": "",
+ "documentation-minute": "",
+ "documentation-month": "",
+ "documentation-pi": "",
+ "documentation-predict-linear": "",
+ "documentation-present-over-time": "",
+ "documentation-quantile-over-time": "",
+ "documentation-rad": "",
+ "documentation-rate": "",
+ "documentation-resets": "",
+ "documentation-round": "",
+ "documentation-scalar": "",
+ "documentation-sgn": "",
+ "documentation-sort": "",
+ "documentation-sort-desc": "",
+ "documentation-sqrt": "",
+ "documentation-stddev-over-time": "",
+ "documentation-stdvar-over-time": "",
+ "documentation-sum-over-time": "",
+ "documentation-time": "",
+ "documentation-timestamp": "",
+ "documentation-vector": "",
+ "documentation-year": ""
+ },
+ "getTrigonometricFunctions": {
+ "documentation-acos": "",
+ "documentation-acosh": "",
+ "documentation-asin": "",
+ "documentation-asinh": "",
+ "documentation-atan": "",
+ "documentation-atanh": "",
+ "documentation-cos": "",
+ "documentation-cosh": "",
+ "documentation-sin": "",
+ "documentation-sinh": "",
+ "documentation-tan": "",
+ "documentation-tanh": ""
+ }
+ },
"querybuilder": {
"additional-settings": {
- "content-filter-metric-names-regex-search-using": "",
- "disable-text-wrap": ""
+ "content-filter-metric-names-regex-search-using": "Prometheus APIの追加呼び出しを使用して、正規表現検索でメトリック名をフィルタリングします。",
+ "disable-text-wrap": "テキストの折り返しを無効化"
},
"feedback-link": {
"give-feedback": "フィードバックを送信",
- "title-give-feedback": ""
+ "title-give-feedback": "メトリックエクスプローラーは新機能です。改善点についてお聞かせください"
},
"get-collapsed-info": {
"exemplars": "",
@@ -250,18 +347,18 @@
},
"handle-function": {
"text": {
- "query-parsing-is-ambiguous": ""
+ "query-parsing-is-ambiguous": "クエリ解析が曖昧です。"
}
},
"label-filter-item": {
- "aria-label-remove": "",
- "placeholder-select-label": "",
+ "aria-label-remove": "{{name}}を削除",
+ "placeholder-select-label": "ラベルを選択",
"placeholder-select-value": "値を選択"
},
"label-filters": {
- "label-filters": "",
- "label-label-filters": "",
- "tooltip-label-filters": ""
+ "label-filters": "ラベルフィルター",
+ "label-label-filters": "ラベルフィルター",
+ "tooltip-label-filters": "オプション: このクエリタイプのメトリック選択をフィルタリングするために使用します。"
},
"label-param-editor": {
"loadingMessage-loading-labels": "",
@@ -269,91 +366,98 @@
},
"metric-combobox": {
"async-select": {
- "aria-label-open-metrics-explorer": "",
- "placeholder-select-metric": "",
- "tooltip-open-metrics-explorer": ""
+ "aria-label-open-metrics-explorer": "メトリックエクスプローラーを開く",
+ "placeholder-select-metric": "メトリックを選択",
+ "tooltip-open-metrics-explorer": "メトリックエクスプローラーを開く"
},
"label-metric": "メトリック",
- "tooltip-metric": ""
+ "tooltip-metric": "オプション: 指定されたメトリックのラベル名に対するラベル値のリストを返します。"
},
"metrics-modal": {
- "additional-settings": "",
+ "additional-settings": "追加設定",
"aria-label-additional-settings": "追加設定",
- "aria-label-browse-metrics": "",
- "currently-selected": "",
- "metrics-pre-filtered": "",
- "placeholder-results-per-page": "",
- "results-per-page": "",
- "title-metrics-explorer": "",
- "results-amount_other": ""
+ "aria-label-browse-metrics": "メトリックを参照",
+ "currently-selected": "現在選択中: {{selected}}",
+ "metrics-pre-filtered": "これらのメトリックは、ラベルフィルターで選択されたラベルによって事前にフィルタリングされています。",
+ "placeholder-results-per-page": "1ページあたりの結果数",
+ "results-per-page": "1ページあたりの結果数",
+ "title-metrics-explorer": "メトリックエクスプローラー",
+ "results-amount_other": "{{count}}件中{{num}}件の結果を表示"
},
"nested-query": {
"label": {
- "ignoring": "",
+ "ignoring": "無視",
"on": "オン"
},
"operator": "オペレーター",
- "tooltip-remove-match": "",
- "vector-matches": ""
+ "tooltip-remove-match": "一致を削除",
+ "vector-matches": "ベクトル一致"
},
"operation-editor": {
- "not-found": "",
- "title-remove": ""
+ "not-found": "操作{{id}}が見つかりません",
+ "title-remove": "{{name}}を削除"
},
"operation-header": {
"placeholder-replace-with": "次で置き換え",
- "title-click-to-view-alternative-operations": "",
- "title-remove-operation": ""
+ "title-click-to-view-alternative-operations": "クリックして代わりの操作を表示",
+ "title-remove-operation": "操作を削除"
},
"operation-info-button": {
- "title-click-to-show-description": "",
- "title-remove-operation": ""
+ "title-click-to-show-description": "クリックして説明を表示",
+ "title-remove-operation": "操作を削除"
},
"operation-list": {
- "operations": "",
+ "operations": "操作",
"placeholder-search": "検索",
- "title-add-operation": ""
+ "title-add-operation": "操作を追加"
},
"operation-param-editor": {
- "title-add": "",
- "title-remove": ""
+ "title-add": "{{name}}を追加",
+ "title-remove": "{{name}}を削除"
+ },
+ "operation-utils": {
+ "getAggregationExplainer": {
+ "label-by": "",
+ "label-default": "",
+ "label-without": ""
+ }
},
"prom-query-builder-options": {
- "aria-label-lower-limit-parameter": "",
- "aria-label-select-resolution": "",
+ "aria-label-lower-limit-parameter": "ステップパラメーターの下限を設定",
+ "aria-label-select-resolution": "解像度を選択",
"format-options": {
"label-heatmap": "",
"label-table": "",
"label-time-series": ""
},
- "label-exemplars": "",
+ "label-exemplars": "エグゼンプラー",
"label-format": "形式",
- "label-min-step": "",
- "label-resolution": "",
+ "label-min-step": "最小ステップ",
+ "label-resolution": "解像度",
"label-type": "種類",
- "placeholder-auto": "",
+ "placeholder-auto": "自動",
"title-options": "オプション",
- "tooltip-min-step": ""
+ "tooltip-min-step": "Prometheusクエリのステップパラメーターと<2>{{interval}}2>および<4>{{rateInterval}}4>変数の追加下限。"
},
"prom-query-code-editor-autocomplete-info": {
- "autocomplete-suggestions-limited": "",
- "tooltip-autocomplete-suggestions-limited": ""
+ "autocomplete-suggestions-limited": "オートコンプリート候補が制限されています",
+ "tooltip-autocomplete-suggestions-limited": "メトリック名の数がオートコンプリート制限を超えています。最も関連性の高い{{autocompleteLimit}}個のメトリックのみが表示されます。データソース設定で閾値を調整できます。"
},
"prom-query-editor-selector": {
"body-syntax-error": "",
"confirmText-continue": "",
"kick-start-your-query": "クエリを開始",
- "label-explain": "",
- "run-queries": "",
- "title-parsing-error-switch-builder": ""
+ "label-explain": "説明",
+ "run-queries": "クエリを実行",
+ "title-parsing-error-switch-builder": "解析エラー: ビルダーモードに切り替えますか?"
},
"prom-query-legend-editor": {
- "label-legend": "",
- "placeholder-select-legend-mode": "",
- "tooltip-legend": ""
+ "label-legend": "凡例",
+ "placeholder-select-legend-mode": "凡例モードを選択",
+ "tooltip-legend": "系列名の上書きまたはテンプレート。例: {{templateExample}}は{{labelName}}のラベル値に置き換えられます。"
},
"query-builder-hints": {
- "hint-details": ""
+ "hint-details": "ヒント: {{hintDetails}}"
},
"query-editor-mode-toggle": {
"editor-modes": {
@@ -362,30 +466,30 @@
}
},
"query-pattern": {
- "apply-query": "",
- "aria-label-apply-query-starter-button": "",
- "aria-label-back-button": "",
- "aria-label-create-new-query-button": "",
- "aria-label-raw-query": "",
- "aria-label-use-this-query-button": "",
+ "apply-query": "クエリを適用",
+ "aria-label-apply-query-starter-button": "クエリ適用開始ボタン",
+ "aria-label-back-button": "戻るボタン",
+ "aria-label-create-new-query-button": "新しいクエリ作成ボタン",
+ "aria-label-raw-query": "{{patternName}}の生クエリ",
+ "aria-label-use-this-query-button": "このクエリボタンを使用",
"back": "戻る",
- "create-new-query": "",
+ "create-new-query": "新しいクエリを作成",
"use-this-query": "このクエリを使用"
},
"query-patterns-modal": {
- "aria-label-close-kick-start-your-query-modal": "",
+ "aria-label-close-kick-start-your-query-modal": "クエリを開始モーダルを閉じる",
"aria-label-kick-start-your-query-modal": "クエリモーダルを開始",
- "aria-label-toggle-query-starter": "",
+ "aria-label-toggle-query-starter": "{{patternType}}クエリ開始カードを開いて閉じる",
"close": "閉じる",
- "description-kick-start-your-query": "",
- "label-toggle-query-starter": "",
+ "description-kick-start-your-query": "これらのクエリの1つを選択してクエリを開始してください。その後、クエリを完了できます。",
+ "label-toggle-query-starter": "{{patternType}}クエリスターター",
"title-kick-start-your-query": "クエリを開始"
},
"raw-query": {
- "aria-label-selector": ""
+ "aria-label-selector": "セレクター"
},
"results-table": {
- "content-descriptive-type": "",
+ "content-descriptive-type": "{{descriptiveType}}を作成する際、Prometheusはタイプカウンターで複数の系列を公開します。",
"description": "説明",
"message-expand-label-filters": "",
"message-expand-search": "",
@@ -396,7 +500,7 @@
},
"update-function-args": {
"text": {
- "query-parsing-is-ambiguous": ""
+ "query-parsing-is-ambiguous": "クエリ解析が曖昧です。"
}
}
}
diff --git a/packages/grafana-prometheus/src/locales/ko-KR/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/ko-KR/grafana-prometheus.json
index 26c7b27eb2f..0fdb0e6d527 100644
--- a/packages/grafana-prometheus/src/locales/ko-KR/grafana-prometheus.json
+++ b/packages/grafana-prometheus/src/locales/ko-KR/grafana-prometheus.json
@@ -209,6 +209,103 @@
"label-verbose": ""
}
},
+ "promql": {
+ "getAggregationOptions": {
+ "documentation-avg": "",
+ "documentation-bottomk": "",
+ "documentation-count": "",
+ "documentation-count-values": "",
+ "documentation-group": "",
+ "documentation-max": "",
+ "documentation-min": "",
+ "documentation-quantile": "",
+ "documentation-stddev": "",
+ "documentation-stdvar": "",
+ "documentation-sum": "",
+ "documentation-topk": ""
+ },
+ "getFunctions": {
+ "documentation-abs": "",
+ "documentation-absent": "",
+ "documentation-absent-over-time": "",
+ "documentation-avg-over-time": "",
+ "documentation-ceil": "",
+ "documentation-changes": "",
+ "documentation-clamp": "",
+ "documentation-clamp-max": "",
+ "documentation-clamp-min": "",
+ "documentation-count-over-time": "",
+ "documentation-count-scalar": "",
+ "documentation-day-of-month": "",
+ "documentation-day-of-week": "",
+ "documentation-day-of-year": "",
+ "documentation-days-in-month": "",
+ "documentation-deg": "",
+ "documentation-delta": "",
+ "documentation-deriv": "",
+ "documentation-double-exponential-smoothing": "",
+ "documentation-drop-common-labels": "",
+ "documentation-exp": "",
+ "documentation-floor": "",
+ "documentation-histogram-avg": "",
+ "documentation-histogram-count": "",
+ "documentation-histogram-fraction": "",
+ "documentation-histogram-quantile": "",
+ "documentation-histogram-stddev": "",
+ "documentation-histogram-stdvar": "",
+ "documentation-histogram-sum": "",
+ "documentation-holt-winters": "",
+ "documentation-hour": "",
+ "documentation-idelta": "",
+ "documentation-increase": "",
+ "documentation-info": "",
+ "documentation-irate": "",
+ "documentation-label-join": "",
+ "documentation-label-replace": "",
+ "documentation-last-over-time": "",
+ "documentation-ln": "",
+ "documentation-log10": "",
+ "documentation-log2": "",
+ "documentation-max-over-time": "",
+ "documentation-min-over-time": "",
+ "documentation-minute": "",
+ "documentation-month": "",
+ "documentation-pi": "",
+ "documentation-predict-linear": "",
+ "documentation-present-over-time": "",
+ "documentation-quantile-over-time": "",
+ "documentation-rad": "",
+ "documentation-rate": "",
+ "documentation-resets": "",
+ "documentation-round": "",
+ "documentation-scalar": "",
+ "documentation-sgn": "",
+ "documentation-sort": "",
+ "documentation-sort-desc": "",
+ "documentation-sqrt": "",
+ "documentation-stddev-over-time": "",
+ "documentation-stdvar-over-time": "",
+ "documentation-sum-over-time": "",
+ "documentation-time": "",
+ "documentation-timestamp": "",
+ "documentation-vector": "",
+ "documentation-year": ""
+ },
+ "getTrigonometricFunctions": {
+ "documentation-acos": "",
+ "documentation-acosh": "",
+ "documentation-asin": "",
+ "documentation-asinh": "",
+ "documentation-atan": "",
+ "documentation-atanh": "",
+ "documentation-cos": "",
+ "documentation-cosh": "",
+ "documentation-sin": "",
+ "documentation-sinh": "",
+ "documentation-tan": "",
+ "documentation-tanh": ""
+ }
+ },
"querybuilder": {
"additional-settings": {
"content-filter-metric-names-regex-search-using": "",
@@ -318,6 +415,13 @@
"title-add": "",
"title-remove": ""
},
+ "operation-utils": {
+ "getAggregationExplainer": {
+ "label-by": "",
+ "label-default": "",
+ "label-without": ""
+ }
+ },
"prom-query-builder-options": {
"aria-label-lower-limit-parameter": "",
"aria-label-select-resolution": "",
diff --git a/packages/grafana-prometheus/src/locales/nl-NL/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/nl-NL/grafana-prometheus.json
index d6bbd899aa2..51074f0b25d 100644
--- a/packages/grafana-prometheus/src/locales/nl-NL/grafana-prometheus.json
+++ b/packages/grafana-prometheus/src/locales/nl-NL/grafana-prometheus.json
@@ -209,6 +209,103 @@
"label-verbose": ""
}
},
+ "promql": {
+ "getAggregationOptions": {
+ "documentation-avg": "",
+ "documentation-bottomk": "",
+ "documentation-count": "",
+ "documentation-count-values": "",
+ "documentation-group": "",
+ "documentation-max": "",
+ "documentation-min": "",
+ "documentation-quantile": "",
+ "documentation-stddev": "",
+ "documentation-stdvar": "",
+ "documentation-sum": "",
+ "documentation-topk": ""
+ },
+ "getFunctions": {
+ "documentation-abs": "",
+ "documentation-absent": "",
+ "documentation-absent-over-time": "",
+ "documentation-avg-over-time": "",
+ "documentation-ceil": "",
+ "documentation-changes": "",
+ "documentation-clamp": "",
+ "documentation-clamp-max": "",
+ "documentation-clamp-min": "",
+ "documentation-count-over-time": "",
+ "documentation-count-scalar": "",
+ "documentation-day-of-month": "",
+ "documentation-day-of-week": "",
+ "documentation-day-of-year": "",
+ "documentation-days-in-month": "",
+ "documentation-deg": "",
+ "documentation-delta": "",
+ "documentation-deriv": "",
+ "documentation-double-exponential-smoothing": "",
+ "documentation-drop-common-labels": "",
+ "documentation-exp": "",
+ "documentation-floor": "",
+ "documentation-histogram-avg": "",
+ "documentation-histogram-count": "",
+ "documentation-histogram-fraction": "",
+ "documentation-histogram-quantile": "",
+ "documentation-histogram-stddev": "",
+ "documentation-histogram-stdvar": "",
+ "documentation-histogram-sum": "",
+ "documentation-holt-winters": "",
+ "documentation-hour": "",
+ "documentation-idelta": "",
+ "documentation-increase": "",
+ "documentation-info": "",
+ "documentation-irate": "",
+ "documentation-label-join": "",
+ "documentation-label-replace": "",
+ "documentation-last-over-time": "",
+ "documentation-ln": "",
+ "documentation-log10": "",
+ "documentation-log2": "",
+ "documentation-max-over-time": "",
+ "documentation-min-over-time": "",
+ "documentation-minute": "",
+ "documentation-month": "",
+ "documentation-pi": "",
+ "documentation-predict-linear": "",
+ "documentation-present-over-time": "",
+ "documentation-quantile-over-time": "",
+ "documentation-rad": "",
+ "documentation-rate": "",
+ "documentation-resets": "",
+ "documentation-round": "",
+ "documentation-scalar": "",
+ "documentation-sgn": "",
+ "documentation-sort": "",
+ "documentation-sort-desc": "",
+ "documentation-sqrt": "",
+ "documentation-stddev-over-time": "",
+ "documentation-stdvar-over-time": "",
+ "documentation-sum-over-time": "",
+ "documentation-time": "",
+ "documentation-timestamp": "",
+ "documentation-vector": "",
+ "documentation-year": ""
+ },
+ "getTrigonometricFunctions": {
+ "documentation-acos": "",
+ "documentation-acosh": "",
+ "documentation-asin": "",
+ "documentation-asinh": "",
+ "documentation-atan": "",
+ "documentation-atanh": "",
+ "documentation-cos": "",
+ "documentation-cosh": "",
+ "documentation-sin": "",
+ "documentation-sinh": "",
+ "documentation-tan": "",
+ "documentation-tanh": ""
+ }
+ },
"querybuilder": {
"additional-settings": {
"content-filter-metric-names-regex-search-using": "Filter metrische namen op regex-zoekopdracht, met behulp van een extra oproep op de Prometheus-API.",
@@ -319,6 +416,13 @@
"title-add": "{{name}} toevoegen",
"title-remove": "{{name}} verwijderen"
},
+ "operation-utils": {
+ "getAggregationExplainer": {
+ "label-by": "",
+ "label-default": "",
+ "label-without": ""
+ }
+ },
"prom-query-builder-options": {
"aria-label-lower-limit-parameter": "Ondergrens instellen voor de stapparameter",
"aria-label-select-resolution": "Resolutie selecteren",
diff --git a/packages/grafana-prometheus/src/locales/pl-PL/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/pl-PL/grafana-prometheus.json
index 38aacf94629..25ef725f484 100644
--- a/packages/grafana-prometheus/src/locales/pl-PL/grafana-prometheus.json
+++ b/packages/grafana-prometheus/src/locales/pl-PL/grafana-prometheus.json
@@ -209,6 +209,103 @@
"label-verbose": ""
}
},
+ "promql": {
+ "getAggregationOptions": {
+ "documentation-avg": "",
+ "documentation-bottomk": "",
+ "documentation-count": "",
+ "documentation-count-values": "",
+ "documentation-group": "",
+ "documentation-max": "",
+ "documentation-min": "",
+ "documentation-quantile": "",
+ "documentation-stddev": "",
+ "documentation-stdvar": "",
+ "documentation-sum": "",
+ "documentation-topk": ""
+ },
+ "getFunctions": {
+ "documentation-abs": "",
+ "documentation-absent": "",
+ "documentation-absent-over-time": "",
+ "documentation-avg-over-time": "",
+ "documentation-ceil": "",
+ "documentation-changes": "",
+ "documentation-clamp": "",
+ "documentation-clamp-max": "",
+ "documentation-clamp-min": "",
+ "documentation-count-over-time": "",
+ "documentation-count-scalar": "",
+ "documentation-day-of-month": "",
+ "documentation-day-of-week": "",
+ "documentation-day-of-year": "",
+ "documentation-days-in-month": "",
+ "documentation-deg": "",
+ "documentation-delta": "",
+ "documentation-deriv": "",
+ "documentation-double-exponential-smoothing": "",
+ "documentation-drop-common-labels": "",
+ "documentation-exp": "",
+ "documentation-floor": "",
+ "documentation-histogram-avg": "",
+ "documentation-histogram-count": "",
+ "documentation-histogram-fraction": "",
+ "documentation-histogram-quantile": "",
+ "documentation-histogram-stddev": "",
+ "documentation-histogram-stdvar": "",
+ "documentation-histogram-sum": "",
+ "documentation-holt-winters": "",
+ "documentation-hour": "",
+ "documentation-idelta": "",
+ "documentation-increase": "",
+ "documentation-info": "",
+ "documentation-irate": "",
+ "documentation-label-join": "",
+ "documentation-label-replace": "",
+ "documentation-last-over-time": "",
+ "documentation-ln": "",
+ "documentation-log10": "",
+ "documentation-log2": "",
+ "documentation-max-over-time": "",
+ "documentation-min-over-time": "",
+ "documentation-minute": "",
+ "documentation-month": "",
+ "documentation-pi": "",
+ "documentation-predict-linear": "",
+ "documentation-present-over-time": "",
+ "documentation-quantile-over-time": "",
+ "documentation-rad": "",
+ "documentation-rate": "",
+ "documentation-resets": "",
+ "documentation-round": "",
+ "documentation-scalar": "",
+ "documentation-sgn": "",
+ "documentation-sort": "",
+ "documentation-sort-desc": "",
+ "documentation-sqrt": "",
+ "documentation-stddev-over-time": "",
+ "documentation-stdvar-over-time": "",
+ "documentation-sum-over-time": "",
+ "documentation-time": "",
+ "documentation-timestamp": "",
+ "documentation-vector": "",
+ "documentation-year": ""
+ },
+ "getTrigonometricFunctions": {
+ "documentation-acos": "",
+ "documentation-acosh": "",
+ "documentation-asin": "",
+ "documentation-asinh": "",
+ "documentation-atan": "",
+ "documentation-atanh": "",
+ "documentation-cos": "",
+ "documentation-cosh": "",
+ "documentation-sin": "",
+ "documentation-sinh": "",
+ "documentation-tan": "",
+ "documentation-tanh": ""
+ }
+ },
"querybuilder": {
"additional-settings": {
"content-filter-metric-names-regex-search-using": "",
@@ -321,6 +418,13 @@
"title-add": "",
"title-remove": ""
},
+ "operation-utils": {
+ "getAggregationExplainer": {
+ "label-by": "",
+ "label-default": "",
+ "label-without": ""
+ }
+ },
"prom-query-builder-options": {
"aria-label-lower-limit-parameter": "",
"aria-label-select-resolution": "",
diff --git a/packages/grafana-prometheus/src/locales/pt-BR/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/pt-BR/grafana-prometheus.json
index 775cb9f3cc3..74e177550c6 100644
--- a/packages/grafana-prometheus/src/locales/pt-BR/grafana-prometheus.json
+++ b/packages/grafana-prometheus/src/locales/pt-BR/grafana-prometheus.json
@@ -209,6 +209,103 @@
"label-verbose": ""
}
},
+ "promql": {
+ "getAggregationOptions": {
+ "documentation-avg": "",
+ "documentation-bottomk": "",
+ "documentation-count": "",
+ "documentation-count-values": "",
+ "documentation-group": "",
+ "documentation-max": "",
+ "documentation-min": "",
+ "documentation-quantile": "",
+ "documentation-stddev": "",
+ "documentation-stdvar": "",
+ "documentation-sum": "",
+ "documentation-topk": ""
+ },
+ "getFunctions": {
+ "documentation-abs": "",
+ "documentation-absent": "",
+ "documentation-absent-over-time": "",
+ "documentation-avg-over-time": "",
+ "documentation-ceil": "",
+ "documentation-changes": "",
+ "documentation-clamp": "",
+ "documentation-clamp-max": "",
+ "documentation-clamp-min": "",
+ "documentation-count-over-time": "",
+ "documentation-count-scalar": "",
+ "documentation-day-of-month": "",
+ "documentation-day-of-week": "",
+ "documentation-day-of-year": "",
+ "documentation-days-in-month": "",
+ "documentation-deg": "",
+ "documentation-delta": "",
+ "documentation-deriv": "",
+ "documentation-double-exponential-smoothing": "",
+ "documentation-drop-common-labels": "",
+ "documentation-exp": "",
+ "documentation-floor": "",
+ "documentation-histogram-avg": "",
+ "documentation-histogram-count": "",
+ "documentation-histogram-fraction": "",
+ "documentation-histogram-quantile": "",
+ "documentation-histogram-stddev": "",
+ "documentation-histogram-stdvar": "",
+ "documentation-histogram-sum": "",
+ "documentation-holt-winters": "",
+ "documentation-hour": "",
+ "documentation-idelta": "",
+ "documentation-increase": "",
+ "documentation-info": "",
+ "documentation-irate": "",
+ "documentation-label-join": "",
+ "documentation-label-replace": "",
+ "documentation-last-over-time": "",
+ "documentation-ln": "",
+ "documentation-log10": "",
+ "documentation-log2": "",
+ "documentation-max-over-time": "",
+ "documentation-min-over-time": "",
+ "documentation-minute": "",
+ "documentation-month": "",
+ "documentation-pi": "",
+ "documentation-predict-linear": "",
+ "documentation-present-over-time": "",
+ "documentation-quantile-over-time": "",
+ "documentation-rad": "",
+ "documentation-rate": "",
+ "documentation-resets": "",
+ "documentation-round": "",
+ "documentation-scalar": "",
+ "documentation-sgn": "",
+ "documentation-sort": "",
+ "documentation-sort-desc": "",
+ "documentation-sqrt": "",
+ "documentation-stddev-over-time": "",
+ "documentation-stdvar-over-time": "",
+ "documentation-sum-over-time": "",
+ "documentation-time": "",
+ "documentation-timestamp": "",
+ "documentation-vector": "",
+ "documentation-year": ""
+ },
+ "getTrigonometricFunctions": {
+ "documentation-acos": "",
+ "documentation-acosh": "",
+ "documentation-asin": "",
+ "documentation-asinh": "",
+ "documentation-atan": "",
+ "documentation-atanh": "",
+ "documentation-cos": "",
+ "documentation-cosh": "",
+ "documentation-sin": "",
+ "documentation-sinh": "",
+ "documentation-tan": "",
+ "documentation-tanh": ""
+ }
+ },
"querybuilder": {
"additional-settings": {
"content-filter-metric-names-regex-search-using": "",
@@ -319,6 +416,13 @@
"title-add": "",
"title-remove": ""
},
+ "operation-utils": {
+ "getAggregationExplainer": {
+ "label-by": "",
+ "label-default": "",
+ "label-without": ""
+ }
+ },
"prom-query-builder-options": {
"aria-label-lower-limit-parameter": "",
"aria-label-select-resolution": "",
diff --git a/packages/grafana-prometheus/src/locales/pt-PT/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/pt-PT/grafana-prometheus.json
index 5d8aa3f0402..93d395b3f57 100644
--- a/packages/grafana-prometheus/src/locales/pt-PT/grafana-prometheus.json
+++ b/packages/grafana-prometheus/src/locales/pt-PT/grafana-prometheus.json
@@ -209,6 +209,103 @@
"label-verbose": ""
}
},
+ "promql": {
+ "getAggregationOptions": {
+ "documentation-avg": "",
+ "documentation-bottomk": "",
+ "documentation-count": "",
+ "documentation-count-values": "",
+ "documentation-group": "",
+ "documentation-max": "",
+ "documentation-min": "",
+ "documentation-quantile": "",
+ "documentation-stddev": "",
+ "documentation-stdvar": "",
+ "documentation-sum": "",
+ "documentation-topk": ""
+ },
+ "getFunctions": {
+ "documentation-abs": "",
+ "documentation-absent": "",
+ "documentation-absent-over-time": "",
+ "documentation-avg-over-time": "",
+ "documentation-ceil": "",
+ "documentation-changes": "",
+ "documentation-clamp": "",
+ "documentation-clamp-max": "",
+ "documentation-clamp-min": "",
+ "documentation-count-over-time": "",
+ "documentation-count-scalar": "",
+ "documentation-day-of-month": "",
+ "documentation-day-of-week": "",
+ "documentation-day-of-year": "",
+ "documentation-days-in-month": "",
+ "documentation-deg": "",
+ "documentation-delta": "",
+ "documentation-deriv": "",
+ "documentation-double-exponential-smoothing": "",
+ "documentation-drop-common-labels": "",
+ "documentation-exp": "",
+ "documentation-floor": "",
+ "documentation-histogram-avg": "",
+ "documentation-histogram-count": "",
+ "documentation-histogram-fraction": "",
+ "documentation-histogram-quantile": "",
+ "documentation-histogram-stddev": "",
+ "documentation-histogram-stdvar": "",
+ "documentation-histogram-sum": "",
+ "documentation-holt-winters": "",
+ "documentation-hour": "",
+ "documentation-idelta": "",
+ "documentation-increase": "",
+ "documentation-info": "",
+ "documentation-irate": "",
+ "documentation-label-join": "",
+ "documentation-label-replace": "",
+ "documentation-last-over-time": "",
+ "documentation-ln": "",
+ "documentation-log10": "",
+ "documentation-log2": "",
+ "documentation-max-over-time": "",
+ "documentation-min-over-time": "",
+ "documentation-minute": "",
+ "documentation-month": "",
+ "documentation-pi": "",
+ "documentation-predict-linear": "",
+ "documentation-present-over-time": "",
+ "documentation-quantile-over-time": "",
+ "documentation-rad": "",
+ "documentation-rate": "",
+ "documentation-resets": "",
+ "documentation-round": "",
+ "documentation-scalar": "",
+ "documentation-sgn": "",
+ "documentation-sort": "",
+ "documentation-sort-desc": "",
+ "documentation-sqrt": "",
+ "documentation-stddev-over-time": "",
+ "documentation-stdvar-over-time": "",
+ "documentation-sum-over-time": "",
+ "documentation-time": "",
+ "documentation-timestamp": "",
+ "documentation-vector": "",
+ "documentation-year": ""
+ },
+ "getTrigonometricFunctions": {
+ "documentation-acos": "",
+ "documentation-acosh": "",
+ "documentation-asin": "",
+ "documentation-asinh": "",
+ "documentation-atan": "",
+ "documentation-atanh": "",
+ "documentation-cos": "",
+ "documentation-cosh": "",
+ "documentation-sin": "",
+ "documentation-sinh": "",
+ "documentation-tan": "",
+ "documentation-tanh": ""
+ }
+ },
"querybuilder": {
"additional-settings": {
"content-filter-metric-names-regex-search-using": "",
@@ -319,6 +416,13 @@
"title-add": "",
"title-remove": ""
},
+ "operation-utils": {
+ "getAggregationExplainer": {
+ "label-by": "",
+ "label-default": "",
+ "label-without": ""
+ }
+ },
"prom-query-builder-options": {
"aria-label-lower-limit-parameter": "",
"aria-label-select-resolution": "",
diff --git a/packages/grafana-prometheus/src/locales/ru-RU/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/ru-RU/grafana-prometheus.json
index e593d2333aa..265b74d6ac3 100644
--- a/packages/grafana-prometheus/src/locales/ru-RU/grafana-prometheus.json
+++ b/packages/grafana-prometheus/src/locales/ru-RU/grafana-prometheus.json
@@ -209,6 +209,103 @@
"label-verbose": ""
}
},
+ "promql": {
+ "getAggregationOptions": {
+ "documentation-avg": "",
+ "documentation-bottomk": "",
+ "documentation-count": "",
+ "documentation-count-values": "",
+ "documentation-group": "",
+ "documentation-max": "",
+ "documentation-min": "",
+ "documentation-quantile": "",
+ "documentation-stddev": "",
+ "documentation-stdvar": "",
+ "documentation-sum": "",
+ "documentation-topk": ""
+ },
+ "getFunctions": {
+ "documentation-abs": "",
+ "documentation-absent": "",
+ "documentation-absent-over-time": "",
+ "documentation-avg-over-time": "",
+ "documentation-ceil": "",
+ "documentation-changes": "",
+ "documentation-clamp": "",
+ "documentation-clamp-max": "",
+ "documentation-clamp-min": "",
+ "documentation-count-over-time": "",
+ "documentation-count-scalar": "",
+ "documentation-day-of-month": "",
+ "documentation-day-of-week": "",
+ "documentation-day-of-year": "",
+ "documentation-days-in-month": "",
+ "documentation-deg": "",
+ "documentation-delta": "",
+ "documentation-deriv": "",
+ "documentation-double-exponential-smoothing": "",
+ "documentation-drop-common-labels": "",
+ "documentation-exp": "",
+ "documentation-floor": "",
+ "documentation-histogram-avg": "",
+ "documentation-histogram-count": "",
+ "documentation-histogram-fraction": "",
+ "documentation-histogram-quantile": "",
+ "documentation-histogram-stddev": "",
+ "documentation-histogram-stdvar": "",
+ "documentation-histogram-sum": "",
+ "documentation-holt-winters": "",
+ "documentation-hour": "",
+ "documentation-idelta": "",
+ "documentation-increase": "",
+ "documentation-info": "",
+ "documentation-irate": "",
+ "documentation-label-join": "",
+ "documentation-label-replace": "",
+ "documentation-last-over-time": "",
+ "documentation-ln": "",
+ "documentation-log10": "",
+ "documentation-log2": "",
+ "documentation-max-over-time": "",
+ "documentation-min-over-time": "",
+ "documentation-minute": "",
+ "documentation-month": "",
+ "documentation-pi": "",
+ "documentation-predict-linear": "",
+ "documentation-present-over-time": "",
+ "documentation-quantile-over-time": "",
+ "documentation-rad": "",
+ "documentation-rate": "",
+ "documentation-resets": "",
+ "documentation-round": "",
+ "documentation-scalar": "",
+ "documentation-sgn": "",
+ "documentation-sort": "",
+ "documentation-sort-desc": "",
+ "documentation-sqrt": "",
+ "documentation-stddev-over-time": "",
+ "documentation-stdvar-over-time": "",
+ "documentation-sum-over-time": "",
+ "documentation-time": "",
+ "documentation-timestamp": "",
+ "documentation-vector": "",
+ "documentation-year": ""
+ },
+ "getTrigonometricFunctions": {
+ "documentation-acos": "",
+ "documentation-acosh": "",
+ "documentation-asin": "",
+ "documentation-asinh": "",
+ "documentation-atan": "",
+ "documentation-atanh": "",
+ "documentation-cos": "",
+ "documentation-cosh": "",
+ "documentation-sin": "",
+ "documentation-sinh": "",
+ "documentation-tan": "",
+ "documentation-tanh": ""
+ }
+ },
"querybuilder": {
"additional-settings": {
"content-filter-metric-names-regex-search-using": "",
@@ -321,6 +418,13 @@
"title-add": "",
"title-remove": ""
},
+ "operation-utils": {
+ "getAggregationExplainer": {
+ "label-by": "",
+ "label-default": "",
+ "label-without": ""
+ }
+ },
"prom-query-builder-options": {
"aria-label-lower-limit-parameter": "",
"aria-label-select-resolution": "",
diff --git a/packages/grafana-prometheus/src/locales/sv-SE/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/sv-SE/grafana-prometheus.json
index 7e50b6aa9ab..7e57336aaca 100644
--- a/packages/grafana-prometheus/src/locales/sv-SE/grafana-prometheus.json
+++ b/packages/grafana-prometheus/src/locales/sv-SE/grafana-prometheus.json
@@ -209,6 +209,103 @@
"label-verbose": ""
}
},
+ "promql": {
+ "getAggregationOptions": {
+ "documentation-avg": "",
+ "documentation-bottomk": "",
+ "documentation-count": "",
+ "documentation-count-values": "",
+ "documentation-group": "",
+ "documentation-max": "",
+ "documentation-min": "",
+ "documentation-quantile": "",
+ "documentation-stddev": "",
+ "documentation-stdvar": "",
+ "documentation-sum": "",
+ "documentation-topk": ""
+ },
+ "getFunctions": {
+ "documentation-abs": "",
+ "documentation-absent": "",
+ "documentation-absent-over-time": "",
+ "documentation-avg-over-time": "",
+ "documentation-ceil": "",
+ "documentation-changes": "",
+ "documentation-clamp": "",
+ "documentation-clamp-max": "",
+ "documentation-clamp-min": "",
+ "documentation-count-over-time": "",
+ "documentation-count-scalar": "",
+ "documentation-day-of-month": "",
+ "documentation-day-of-week": "",
+ "documentation-day-of-year": "",
+ "documentation-days-in-month": "",
+ "documentation-deg": "",
+ "documentation-delta": "",
+ "documentation-deriv": "",
+ "documentation-double-exponential-smoothing": "",
+ "documentation-drop-common-labels": "",
+ "documentation-exp": "",
+ "documentation-floor": "",
+ "documentation-histogram-avg": "",
+ "documentation-histogram-count": "",
+ "documentation-histogram-fraction": "",
+ "documentation-histogram-quantile": "",
+ "documentation-histogram-stddev": "",
+ "documentation-histogram-stdvar": "",
+ "documentation-histogram-sum": "",
+ "documentation-holt-winters": "",
+ "documentation-hour": "",
+ "documentation-idelta": "",
+ "documentation-increase": "",
+ "documentation-info": "",
+ "documentation-irate": "",
+ "documentation-label-join": "",
+ "documentation-label-replace": "",
+ "documentation-last-over-time": "",
+ "documentation-ln": "",
+ "documentation-log10": "",
+ "documentation-log2": "",
+ "documentation-max-over-time": "",
+ "documentation-min-over-time": "",
+ "documentation-minute": "",
+ "documentation-month": "",
+ "documentation-pi": "",
+ "documentation-predict-linear": "",
+ "documentation-present-over-time": "",
+ "documentation-quantile-over-time": "",
+ "documentation-rad": "",
+ "documentation-rate": "",
+ "documentation-resets": "",
+ "documentation-round": "",
+ "documentation-scalar": "",
+ "documentation-sgn": "",
+ "documentation-sort": "",
+ "documentation-sort-desc": "",
+ "documentation-sqrt": "",
+ "documentation-stddev-over-time": "",
+ "documentation-stdvar-over-time": "",
+ "documentation-sum-over-time": "",
+ "documentation-time": "",
+ "documentation-timestamp": "",
+ "documentation-vector": "",
+ "documentation-year": ""
+ },
+ "getTrigonometricFunctions": {
+ "documentation-acos": "",
+ "documentation-acosh": "",
+ "documentation-asin": "",
+ "documentation-asinh": "",
+ "documentation-atan": "",
+ "documentation-atanh": "",
+ "documentation-cos": "",
+ "documentation-cosh": "",
+ "documentation-sin": "",
+ "documentation-sinh": "",
+ "documentation-tan": "",
+ "documentation-tanh": ""
+ }
+ },
"querybuilder": {
"additional-settings": {
"content-filter-metric-names-regex-search-using": "",
@@ -319,6 +416,13 @@
"title-add": "",
"title-remove": ""
},
+ "operation-utils": {
+ "getAggregationExplainer": {
+ "label-by": "",
+ "label-default": "",
+ "label-without": ""
+ }
+ },
"prom-query-builder-options": {
"aria-label-lower-limit-parameter": "",
"aria-label-select-resolution": "",
diff --git a/packages/grafana-prometheus/src/locales/tr-TR/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/tr-TR/grafana-prometheus.json
index 46d4ce11257..b834bace3db 100644
--- a/packages/grafana-prometheus/src/locales/tr-TR/grafana-prometheus.json
+++ b/packages/grafana-prometheus/src/locales/tr-TR/grafana-prometheus.json
@@ -209,6 +209,103 @@
"label-verbose": ""
}
},
+ "promql": {
+ "getAggregationOptions": {
+ "documentation-avg": "",
+ "documentation-bottomk": "",
+ "documentation-count": "",
+ "documentation-count-values": "",
+ "documentation-group": "",
+ "documentation-max": "",
+ "documentation-min": "",
+ "documentation-quantile": "",
+ "documentation-stddev": "",
+ "documentation-stdvar": "",
+ "documentation-sum": "",
+ "documentation-topk": ""
+ },
+ "getFunctions": {
+ "documentation-abs": "",
+ "documentation-absent": "",
+ "documentation-absent-over-time": "",
+ "documentation-avg-over-time": "",
+ "documentation-ceil": "",
+ "documentation-changes": "",
+ "documentation-clamp": "",
+ "documentation-clamp-max": "",
+ "documentation-clamp-min": "",
+ "documentation-count-over-time": "",
+ "documentation-count-scalar": "",
+ "documentation-day-of-month": "",
+ "documentation-day-of-week": "",
+ "documentation-day-of-year": "",
+ "documentation-days-in-month": "",
+ "documentation-deg": "",
+ "documentation-delta": "",
+ "documentation-deriv": "",
+ "documentation-double-exponential-smoothing": "",
+ "documentation-drop-common-labels": "",
+ "documentation-exp": "",
+ "documentation-floor": "",
+ "documentation-histogram-avg": "",
+ "documentation-histogram-count": "",
+ "documentation-histogram-fraction": "",
+ "documentation-histogram-quantile": "",
+ "documentation-histogram-stddev": "",
+ "documentation-histogram-stdvar": "",
+ "documentation-histogram-sum": "",
+ "documentation-holt-winters": "",
+ "documentation-hour": "",
+ "documentation-idelta": "",
+ "documentation-increase": "",
+ "documentation-info": "",
+ "documentation-irate": "",
+ "documentation-label-join": "",
+ "documentation-label-replace": "",
+ "documentation-last-over-time": "",
+ "documentation-ln": "",
+ "documentation-log10": "",
+ "documentation-log2": "",
+ "documentation-max-over-time": "",
+ "documentation-min-over-time": "",
+ "documentation-minute": "",
+ "documentation-month": "",
+ "documentation-pi": "",
+ "documentation-predict-linear": "",
+ "documentation-present-over-time": "",
+ "documentation-quantile-over-time": "",
+ "documentation-rad": "",
+ "documentation-rate": "",
+ "documentation-resets": "",
+ "documentation-round": "",
+ "documentation-scalar": "",
+ "documentation-sgn": "",
+ "documentation-sort": "",
+ "documentation-sort-desc": "",
+ "documentation-sqrt": "",
+ "documentation-stddev-over-time": "",
+ "documentation-stdvar-over-time": "",
+ "documentation-sum-over-time": "",
+ "documentation-time": "",
+ "documentation-timestamp": "",
+ "documentation-vector": "",
+ "documentation-year": ""
+ },
+ "getTrigonometricFunctions": {
+ "documentation-acos": "",
+ "documentation-acosh": "",
+ "documentation-asin": "",
+ "documentation-asinh": "",
+ "documentation-atan": "",
+ "documentation-atanh": "",
+ "documentation-cos": "",
+ "documentation-cosh": "",
+ "documentation-sin": "",
+ "documentation-sinh": "",
+ "documentation-tan": "",
+ "documentation-tanh": ""
+ }
+ },
"querybuilder": {
"additional-settings": {
"content-filter-metric-names-regex-search-using": "",
@@ -319,6 +416,13 @@
"title-add": "",
"title-remove": ""
},
+ "operation-utils": {
+ "getAggregationExplainer": {
+ "label-by": "",
+ "label-default": "",
+ "label-without": ""
+ }
+ },
"prom-query-builder-options": {
"aria-label-lower-limit-parameter": "",
"aria-label-select-resolution": "",
diff --git a/packages/grafana-prometheus/src/locales/zh-Hans/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/zh-Hans/grafana-prometheus.json
index 9bb70f50992..242003931cd 100644
--- a/packages/grafana-prometheus/src/locales/zh-Hans/grafana-prometheus.json
+++ b/packages/grafana-prometheus/src/locales/zh-Hans/grafana-prometheus.json
@@ -209,6 +209,103 @@
"label-verbose": ""
}
},
+ "promql": {
+ "getAggregationOptions": {
+ "documentation-avg": "",
+ "documentation-bottomk": "",
+ "documentation-count": "",
+ "documentation-count-values": "",
+ "documentation-group": "",
+ "documentation-max": "",
+ "documentation-min": "",
+ "documentation-quantile": "",
+ "documentation-stddev": "",
+ "documentation-stdvar": "",
+ "documentation-sum": "",
+ "documentation-topk": ""
+ },
+ "getFunctions": {
+ "documentation-abs": "",
+ "documentation-absent": "",
+ "documentation-absent-over-time": "",
+ "documentation-avg-over-time": "",
+ "documentation-ceil": "",
+ "documentation-changes": "",
+ "documentation-clamp": "",
+ "documentation-clamp-max": "",
+ "documentation-clamp-min": "",
+ "documentation-count-over-time": "",
+ "documentation-count-scalar": "",
+ "documentation-day-of-month": "",
+ "documentation-day-of-week": "",
+ "documentation-day-of-year": "",
+ "documentation-days-in-month": "",
+ "documentation-deg": "",
+ "documentation-delta": "",
+ "documentation-deriv": "",
+ "documentation-double-exponential-smoothing": "",
+ "documentation-drop-common-labels": "",
+ "documentation-exp": "",
+ "documentation-floor": "",
+ "documentation-histogram-avg": "",
+ "documentation-histogram-count": "",
+ "documentation-histogram-fraction": "",
+ "documentation-histogram-quantile": "",
+ "documentation-histogram-stddev": "",
+ "documentation-histogram-stdvar": "",
+ "documentation-histogram-sum": "",
+ "documentation-holt-winters": "",
+ "documentation-hour": "",
+ "documentation-idelta": "",
+ "documentation-increase": "",
+ "documentation-info": "",
+ "documentation-irate": "",
+ "documentation-label-join": "",
+ "documentation-label-replace": "",
+ "documentation-last-over-time": "",
+ "documentation-ln": "",
+ "documentation-log10": "",
+ "documentation-log2": "",
+ "documentation-max-over-time": "",
+ "documentation-min-over-time": "",
+ "documentation-minute": "",
+ "documentation-month": "",
+ "documentation-pi": "",
+ "documentation-predict-linear": "",
+ "documentation-present-over-time": "",
+ "documentation-quantile-over-time": "",
+ "documentation-rad": "",
+ "documentation-rate": "",
+ "documentation-resets": "",
+ "documentation-round": "",
+ "documentation-scalar": "",
+ "documentation-sgn": "",
+ "documentation-sort": "",
+ "documentation-sort-desc": "",
+ "documentation-sqrt": "",
+ "documentation-stddev-over-time": "",
+ "documentation-stdvar-over-time": "",
+ "documentation-sum-over-time": "",
+ "documentation-time": "",
+ "documentation-timestamp": "",
+ "documentation-vector": "",
+ "documentation-year": ""
+ },
+ "getTrigonometricFunctions": {
+ "documentation-acos": "",
+ "documentation-acosh": "",
+ "documentation-asin": "",
+ "documentation-asinh": "",
+ "documentation-atan": "",
+ "documentation-atanh": "",
+ "documentation-cos": "",
+ "documentation-cosh": "",
+ "documentation-sin": "",
+ "documentation-sinh": "",
+ "documentation-tan": "",
+ "documentation-tanh": ""
+ }
+ },
"querybuilder": {
"additional-settings": {
"content-filter-metric-names-regex-search-using": "使用 Prometheus API 上的其他调用,通过正则表达式搜索筛选指标名称。",
@@ -318,6 +415,13 @@
"title-add": "添加{{name}}",
"title-remove": "移除{{name}}"
},
+ "operation-utils": {
+ "getAggregationExplainer": {
+ "label-by": "",
+ "label-default": "",
+ "label-without": ""
+ }
+ },
"prom-query-builder-options": {
"aria-label-lower-limit-parameter": "设置步长参数的下限",
"aria-label-select-resolution": "选择分辨率",
diff --git a/packages/grafana-prometheus/src/locales/zh-Hant/grafana-prometheus.json b/packages/grafana-prometheus/src/locales/zh-Hant/grafana-prometheus.json
index 80a90677692..81bdc65f727 100644
--- a/packages/grafana-prometheus/src/locales/zh-Hant/grafana-prometheus.json
+++ b/packages/grafana-prometheus/src/locales/zh-Hant/grafana-prometheus.json
@@ -209,6 +209,103 @@
"label-verbose": ""
}
},
+ "promql": {
+ "getAggregationOptions": {
+ "documentation-avg": "",
+ "documentation-bottomk": "",
+ "documentation-count": "",
+ "documentation-count-values": "",
+ "documentation-group": "",
+ "documentation-max": "",
+ "documentation-min": "",
+ "documentation-quantile": "",
+ "documentation-stddev": "",
+ "documentation-stdvar": "",
+ "documentation-sum": "",
+ "documentation-topk": ""
+ },
+ "getFunctions": {
+ "documentation-abs": "",
+ "documentation-absent": "",
+ "documentation-absent-over-time": "",
+ "documentation-avg-over-time": "",
+ "documentation-ceil": "",
+ "documentation-changes": "",
+ "documentation-clamp": "",
+ "documentation-clamp-max": "",
+ "documentation-clamp-min": "",
+ "documentation-count-over-time": "",
+ "documentation-count-scalar": "",
+ "documentation-day-of-month": "",
+ "documentation-day-of-week": "",
+ "documentation-day-of-year": "",
+ "documentation-days-in-month": "",
+ "documentation-deg": "",
+ "documentation-delta": "",
+ "documentation-deriv": "",
+ "documentation-double-exponential-smoothing": "",
+ "documentation-drop-common-labels": "",
+ "documentation-exp": "",
+ "documentation-floor": "",
+ "documentation-histogram-avg": "",
+ "documentation-histogram-count": "",
+ "documentation-histogram-fraction": "",
+ "documentation-histogram-quantile": "",
+ "documentation-histogram-stddev": "",
+ "documentation-histogram-stdvar": "",
+ "documentation-histogram-sum": "",
+ "documentation-holt-winters": "",
+ "documentation-hour": "",
+ "documentation-idelta": "",
+ "documentation-increase": "",
+ "documentation-info": "",
+ "documentation-irate": "",
+ "documentation-label-join": "",
+ "documentation-label-replace": "",
+ "documentation-last-over-time": "",
+ "documentation-ln": "",
+ "documentation-log10": "",
+ "documentation-log2": "",
+ "documentation-max-over-time": "",
+ "documentation-min-over-time": "",
+ "documentation-minute": "",
+ "documentation-month": "",
+ "documentation-pi": "",
+ "documentation-predict-linear": "",
+ "documentation-present-over-time": "",
+ "documentation-quantile-over-time": "",
+ "documentation-rad": "",
+ "documentation-rate": "",
+ "documentation-resets": "",
+ "documentation-round": "",
+ "documentation-scalar": "",
+ "documentation-sgn": "",
+ "documentation-sort": "",
+ "documentation-sort-desc": "",
+ "documentation-sqrt": "",
+ "documentation-stddev-over-time": "",
+ "documentation-stdvar-over-time": "",
+ "documentation-sum-over-time": "",
+ "documentation-time": "",
+ "documentation-timestamp": "",
+ "documentation-vector": "",
+ "documentation-year": ""
+ },
+ "getTrigonometricFunctions": {
+ "documentation-acos": "",
+ "documentation-acosh": "",
+ "documentation-asin": "",
+ "documentation-asinh": "",
+ "documentation-atan": "",
+ "documentation-atanh": "",
+ "documentation-cos": "",
+ "documentation-cosh": "",
+ "documentation-sin": "",
+ "documentation-sinh": "",
+ "documentation-tan": "",
+ "documentation-tanh": ""
+ }
+ },
"querybuilder": {
"additional-settings": {
"content-filter-metric-names-regex-search-using": "透過正規表達式搜尋篩選指標名稱,並使用額外的 Prometheus API 呼叫。",
@@ -318,6 +415,13 @@
"title-add": "新增{{name}}",
"title-remove": "移除{{name}}"
},
+ "operation-utils": {
+ "getAggregationExplainer": {
+ "label-by": "",
+ "label-default": "",
+ "label-without": ""
+ }
+ },
"prom-query-builder-options": {
"aria-label-lower-limit-parameter": "設定步驟參數的下限",
"aria-label-select-resolution": "選擇解決方案",
diff --git a/packages/grafana-prometheus/src/promql.ts b/packages/grafana-prometheus/src/promql.ts
index 9235777c6a5..d3e6304312b 100644
--- a/packages/grafana-prometheus/src/promql.ts
+++ b/packages/grafana-prometheus/src/promql.ts
@@ -1,577 +1,819 @@
// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/promql.ts
import { Grammar } from 'prismjs';
+import { t } from '@grafana/i18n';
import { CompletionItem } from '@grafana/ui';
export const OPERATORS = ['by', 'group_left', 'group_right', 'ignoring', 'on', 'offset', 'without'];
export const LOGICAL_OPERATORS = ['or', 'and', 'unless'];
-const TRIGONOMETRIC_FUNCTIONS: CompletionItem[] = [
+const getTrigonometricFunctions: () => CompletionItem[] = () => [
{
label: 'acos',
insertText: 'acos',
detail: 'acos(v instant-vector)',
- documentation: 'calculates the arccosine of all elements in v',
+ documentation: t(
+ 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-acos',
+ 'calculates the arccosine of all elements in {{argument}}',
+ { argument: 'v' }
+ ),
},
{
label: 'acosh',
insertText: 'acosh',
detail: 'acosh(v instant-vector)',
- documentation: 'calculates the inverse hyperbolic cosine of all elements in v',
+ documentation: t(
+ 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-acosh',
+ 'calculates the inverse hyperbolic cosine of all elements in {{argument}}',
+ { argument: 'v' }
+ ),
},
{
label: 'asin',
insertText: 'asin',
detail: 'asin(v instant-vector)',
- documentation: 'calculates the arcsine of all elements in v',
+ documentation: t(
+ 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-asin',
+ 'calculates the arcsine of all elements in {{argument}}',
+ { argument: 'v' }
+ ),
},
{
label: 'asinh',
insertText: 'asinh',
detail: 'asinh(v instant-vector)',
- documentation: 'calculates the inverse hyperbolic sine of all elements in v',
+ documentation: t(
+ 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-asinh',
+ 'calculates the inverse hyperbolic sine of all elements in {{argument}}',
+ { argument: 'v' }
+ ),
},
{
label: 'atan',
insertText: 'atan',
detail: 'atan(v instant-vector)',
- documentation: 'calculates the arctangent of all elements in v',
+ documentation: t(
+ 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-atan',
+ 'calculates the arctangent of all elements in {{argument}}',
+ { argument: 'v' }
+ ),
},
{
label: 'atanh',
insertText: 'atanh',
detail: 'atanh(v instant-vector)',
- documentation: 'calculates the inverse hyperbolic tangent of all elements in v',
+ documentation: t(
+ 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-atanh',
+ 'calculates the inverse hyperbolic tangent of all elements in {{argument}}',
+ { argument: 'v' }
+ ),
},
{
label: 'cos',
insertText: 'cos',
detail: 'cos(v instant-vector)',
- documentation: 'calculates the cosine of all elements in v',
+ documentation: t(
+ 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-cos',
+ 'calculates the cosine of all elements in {{argument}}',
+ { argument: 'v' }
+ ),
},
{
label: 'cosh',
insertText: 'cosh',
detail: 'cosh(v instant-vector)',
- documentation: 'calculates the hyperbolic cosine of all elements in v',
+ documentation: t(
+ 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-cosh',
+ 'calculates the hyperbolic cosine of all elements in {{argument}}',
+ { argument: 'v' }
+ ),
},
{
label: 'sin',
insertText: 'sin',
detail: 'sin(v instant-vector)',
- documentation: 'calculates the sine of all elements in v',
+ documentation: t(
+ 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-sin',
+ 'calculates the sine of all elements in {{argument}}',
+ { argument: 'v' }
+ ),
},
{
label: 'sinh',
insertText: 'sinh',
detail: 'sinh(v instant-vector)',
- documentation: 'calculates the hyperbolic sine of all elements in v',
+ documentation: t(
+ 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-sinh',
+ 'calculates the hyperbolic sine of all elements in {{argument}}',
+ { argument: 'v' }
+ ),
},
{
label: 'tan',
insertText: 'tan',
detail: 'tan(v instant-vector)',
- documentation: 'calculates the tangent of all elements in v',
+ documentation: t(
+ 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-tan',
+ 'calculates the tangent of all elements in {{argument}}',
+ { argument: 'v' }
+ ),
},
{
label: 'tanh',
insertText: 'tanh',
detail: 'tanh(v instant-vector)',
- documentation: 'calculates the hyperbolic tangent of all elements in v',
+ documentation: t(
+ 'grafana-prometheus.promql.getTrigonometricFunctions.documentation-tanh',
+ 'calculates the hyperbolic tangent of all elements in {{argument}}',
+ { argument: 'v' }
+ ),
},
];
-const AGGREGATION_OPERATORS: CompletionItem[] = [
+const getAggregationOptions: () => CompletionItem[] = () => [
{
label: 'sum',
insertText: 'sum',
- documentation: 'Calculate sum over dimensions',
+ documentation: t(
+ 'grafana-prometheus.promql.getAggregationOptions.documentation-sum',
+ 'Calculate sum over dimensions'
+ ),
},
{
label: 'min',
insertText: 'min',
- documentation: 'Select minimum over dimensions',
+ documentation: t(
+ 'grafana-prometheus.promql.getAggregationOptions.documentation-min',
+ 'Select minimum over dimensions'
+ ),
},
{
label: 'max',
insertText: 'max',
- documentation: 'Select maximum over dimensions',
+ documentation: t(
+ 'grafana-prometheus.promql.getAggregationOptions.documentation-max',
+ 'Select maximum over dimensions'
+ ),
},
{
label: 'avg',
insertText: 'avg',
- documentation: 'Calculate the average over dimensions',
+ documentation: t(
+ 'grafana-prometheus.promql.getAggregationOptions.documentation-avg',
+ 'Calculate the average over dimensions'
+ ),
},
{
label: 'group',
insertText: 'group',
- documentation: 'All values in the resulting vector are 1',
+ documentation: t(
+ 'grafana-prometheus.promql.getAggregationOptions.documentation-group',
+ 'All values in the resulting vector are 1'
+ ),
},
{
label: 'stddev',
insertText: 'stddev',
- documentation: 'Calculate population standard deviation over dimensions',
+ documentation: t(
+ 'grafana-prometheus.promql.getAggregationOptions.documentation-stddev',
+ 'Calculate population standard deviation over dimensions'
+ ),
},
{
label: 'stdvar',
insertText: 'stdvar',
- documentation: 'Calculate population standard variance over dimensions',
+ documentation: t(
+ 'grafana-prometheus.promql.getAggregationOptions.documentation-stdvar',
+ 'Calculate population standard variance over dimensions'
+ ),
},
{
label: 'count',
insertText: 'count',
- documentation: 'Count number of elements in the vector',
+ documentation: t(
+ 'grafana-prometheus.promql.getAggregationOptions.documentation-count',
+ 'Count number of elements in the vector'
+ ),
},
{
label: 'count_values',
insertText: 'count_values',
- documentation: 'Count number of elements with the same value',
+ documentation: t(
+ 'grafana-prometheus.promql.getAggregationOptions.documentation-count-values',
+ 'Count number of elements with the same value'
+ ),
},
{
label: 'bottomk',
insertText: 'bottomk',
- documentation: 'Smallest k elements by sample value',
+ documentation: t(
+ 'grafana-prometheus.promql.getAggregationOptions.documentation-bottomk',
+ 'Smallest k elements by sample value'
+ ),
},
{
label: 'topk',
insertText: 'topk',
- documentation: 'Largest k elements by sample value',
+ documentation: t(
+ 'grafana-prometheus.promql.getAggregationOptions.documentation-topk',
+ 'Largest k elements by sample value'
+ ),
},
{
label: 'quantile',
insertText: 'quantile',
- documentation: 'Calculate φ-quantile (0 ≤ φ ≤ 1) over dimensions',
+ documentation: t(
+ 'grafana-prometheus.promql.getAggregationOptions.documentation-quantile',
+ 'Calculate φ-quantile (0 ≤ φ ≤ 1) over dimensions'
+ ),
},
];
-export const FUNCTIONS = [
- ...AGGREGATION_OPERATORS,
- ...TRIGONOMETRIC_FUNCTIONS,
+export const getFunctions = () => [
+ ...getAggregationOptions(),
+ ...getTrigonometricFunctions(),
{
insertText: 'abs',
label: 'abs',
detail: 'abs(v instant-vector)',
- documentation: 'Returns the input vector with all sample values converted to their absolute value.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-abs',
+ 'Returns the input vector with all sample values converted to their absolute value.'
+ ),
},
{
insertText: 'absent',
label: 'absent',
detail: 'absent(v instant-vector)',
- documentation:
- 'Returns an empty vector if the vector passed to it has any elements and a 1-element vector with the value 1 if the vector passed to it has no elements. This is useful for alerting on when no time series exist for a given metric name and label combination.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-absent',
+ 'Returns an empty vector if the vector passed to it has any elements and a 1-element vector with the value 1 if the vector passed to it has no elements. This is useful for alerting on when no time series exist for a given metric name and label combination.'
+ ),
},
{
insertText: 'absent_over_time',
label: 'absent_over_time',
detail: 'absent(v range-vector)',
- documentation:
- 'Returns an empty vector if the range vector passed to it has any elements and a 1-element vector with the value 1 if the range vector passed to it has no elements.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-absent-over-time',
+ 'Returns an empty vector if the range vector passed to it has any elements and a 1-element vector with the value 1 if the range vector passed to it has no elements.'
+ ),
},
{
insertText: 'ceil',
label: 'ceil',
detail: 'ceil(v instant-vector)',
- documentation: 'Rounds the sample values of all elements in `v` up to the nearest integer.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-ceil',
+ 'Rounds the sample values of all elements in `v` up to the nearest integer.'
+ ),
},
{
insertText: 'changes',
label: 'changes',
detail: 'changes(v range-vector)',
- documentation:
- 'For each input time series, `changes(v range-vector)` returns the number of times its value has changed within the provided time range as an instant vector.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-changes',
+ 'For each input time series, `changes(v range-vector)` returns the number of times its value has changed within the provided time range as an instant vector.'
+ ),
},
{
insertText: 'clamp',
label: 'clamp',
detail: 'clamp(v instant-vector, min scalar, max scalar)',
- documentation:
- 'Clamps the sample values of all elements in `v` to have a lower limit of `min` and an upper limit of `max`.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-clamp',
+ 'Clamps the sample values of all elements in `v` to have a lower limit of `min` and an upper limit of `max`.'
+ ),
},
{
insertText: 'clamp_max',
label: 'clamp_max',
detail: 'clamp_max(v instant-vector, max scalar)',
- documentation: 'Clamps the sample values of all elements in `v` to have an upper limit of `max`.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-clamp-max',
+ 'Clamps the sample values of all elements in `v` to have an upper limit of `max`.'
+ ),
},
{
insertText: 'clamp_min',
label: 'clamp_min',
detail: 'clamp_min(v instant-vector, min scalar)',
- documentation: 'Clamps the sample values of all elements in `v` to have a lower limit of `min`.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-clamp-min',
+ 'Clamps the sample values of all elements in `v` to have a lower limit of `min`.'
+ ),
},
{
insertText: 'count_scalar',
label: 'count_scalar',
detail: 'count_scalar(v instant-vector)',
- documentation:
- 'Returns the number of elements in a time series vector as a scalar. This is in contrast to the `count()` aggregation operator, which always returns a vector (an empty one if the input vector is empty) and allows grouping by labels via a `by` clause.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-count-scalar',
+ 'Returns the number of elements in a time series vector as a scalar. This is in contrast to the `count()` aggregation operator, which always returns a vector (an empty one if the input vector is empty) and allows grouping by labels via a `by` clause.'
+ ),
},
{
insertText: 'deg',
label: 'deg',
detail: 'deg(v instant-vector)',
- documentation: 'Converts radians to degrees for all elements in v',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-deg',
+ 'Converts radians to degrees for all elements in v'
+ ),
},
{
insertText: 'day_of_month',
label: 'day_of_month',
detail: 'day_of_month(v=vector(time()) instant-vector)',
- documentation: 'Returns the day of the month for each of the given times in UTC. Returned values are from 1 to 31.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-day-of-month',
+ 'Returns the day of the month for each of the given times in UTC. Returned values are from 1 to 31.'
+ ),
},
{
insertText: 'day_of_week',
label: 'day_of_week',
detail: 'day_of_week(v=vector(time()) instant-vector)',
- documentation:
- 'Returns the day of the week for each of the given times in UTC. Returned values are from 0 to 6, where 0 means Sunday etc.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-day-of-week',
+ 'Returns the day of the week for each of the given times in UTC. Returned values are from 0 to 6, where 0 means Sunday etc.'
+ ),
},
{
insertText: 'day_of_year',
label: 'day_of_year',
detail: 'day_of_year(v=vector(time()) instant-vector)',
- documentation:
- 'Returns the day of the year for each of the given times in UTC. Returned values are from 1 to 365 for non-leap years, and 1 to 366 in leap years.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-day-of-year',
+ 'Returns the day of the year for each of the given times in UTC. Returned values are from 1 to 365 for non-leap years, and 1 to 366 in leap years.'
+ ),
},
{
insertText: 'days_in_month',
label: 'days_in_month',
detail: 'days_in_month(v=vector(time()) instant-vector)',
- documentation:
- 'Returns number of days in the month for each of the given times in UTC. Returned values are from 28 to 31.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-days-in-month',
+ 'Returns number of days in the month for each of the given times in UTC. Returned values are from 28 to 31.'
+ ),
},
{
insertText: 'delta',
label: 'delta',
detail: 'delta(v range-vector)',
- documentation:
- 'Calculates the difference between the first and last value of each time series element in a range vector `v`, returning an instant vector with the given deltas and equivalent labels. The delta is extrapolated to cover the full time range as specified in the range vector selector, so that it is possible to get a non-integer result even if the sample values are all integers.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-delta',
+ 'Calculates the difference between the first and last value of each time series element in a range vector `v`, returning an instant vector with the given deltas and equivalent labels. The delta is extrapolated to cover the full time range as specified in the range vector selector, so that it is possible to get a non-integer result even if the sample values are all integers.'
+ ),
},
{
insertText: 'deriv',
label: 'deriv',
detail: 'deriv(v range-vector)',
- documentation:
- 'Calculates the per-second derivative of the time series in a range vector `v`, using simple linear regression.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-deriv',
+ 'Calculates the per-second derivative of the time series in a range vector `v`, using simple linear regression.'
+ ),
},
{
insertText: 'double_exponential_smoothing',
label: 'double_exponential_smoothing',
detail: 'double_exponential_smoothing(v range-vector, sf scalar, tf scalar)',
- documentation:
- 'Produces a smoothed value for time series based on the range in `v`. The lower the smoothing factor `sf`, the more importance is given to old data. The higher the trend factor `tf`, the more trends in the data is considered. Both `sf` and `tf` must be between 0 and 1.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-double-exponential-smoothing',
+ 'Produces a smoothed value for time series based on the range in `v`. The lower the smoothing factor `sf`, the more importance is given to old data. The higher the trend factor `tf`, the more trends in the data is considered. Both `sf` and `tf` must be between 0 and 1.'
+ ),
},
{
insertText: 'drop_common_labels',
label: 'drop_common_labels',
detail: 'drop_common_labels(instant-vector)',
- documentation: 'Drops all labels that have the same name and value across all series in the input vector.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-drop-common-labels',
+ 'Drops all labels that have the same name and value across all series in the input vector.'
+ ),
},
{
insertText: 'exp',
label: 'exp',
detail: 'exp(v instant-vector)',
- documentation:
- 'Calculates the exponential function for all elements in `v`.\nSpecial cases are:\n* `Exp(+Inf) = +Inf` \n* `Exp(NaN) = NaN`',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-exp',
+ 'Calculates the exponential function for all elements in `v`.\nSpecial cases are:\n* `Exp(+Inf) = +Inf` \n* `Exp(NaN) = NaN`'
+ ),
},
{
insertText: 'floor',
label: 'floor',
detail: 'floor(v instant-vector)',
- documentation: 'Rounds the sample values of all elements in `v` down to the nearest integer.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-floor',
+ 'Rounds the sample values of all elements in `v` down to the nearest integer.'
+ ),
},
{
insertText: 'histogram_quantile',
label: 'histogram_quantile',
detail: 'histogram_quantile(φ float, b instant-vector)',
- documentation:
- 'Calculates the φ-quantile (0 ≤ φ ≤ 1) from the buckets `b` of a histogram. The samples in `b` are the counts of observations in each bucket. Each sample must have a label `le` where the label value denotes the inclusive upper bound of the bucket. (Samples without such a label are silently ignored.) The histogram metric type automatically provides time series with the `_bucket` suffix and the appropriate labels.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-histogram-quantile',
+ 'Calculates the φ-quantile (0 ≤ φ ≤ 1) from the buckets `b` of a histogram. The samples in `b` are the counts of observations in each bucket. Each sample must have a label `le` where the label value denotes the inclusive upper bound of the bucket. (Samples without such a label are silently ignored.) The histogram metric type automatically provides time series with the `_bucket` suffix and the appropriate labels.'
+ ),
},
{
insertText: 'holt_winters',
label: 'holt_winters',
detail: 'holt_winters(v range-vector, sf scalar, tf scalar)',
- documentation:
- 'Renamed as double_exponential_smoothing in prometheus v3.x. For prometheus versions equal and greater than v3.0 please use double_exponential_smoothing. \n\nProduces a smoothed value for time series based on the range in `v`. The lower the smoothing factor `sf`, the more importance is given to old data. The higher the trend factor `tf`, the more trends in the data is considered. Both `sf` and `tf` must be between 0 and 1.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-holt-winters',
+ 'Renamed as double_exponential_smoothing in prometheus v3.x. For prometheus versions equal and greater than v3.0 please use double_exponential_smoothing. \n\nProduces a smoothed value for time series based on the range in `v`. The lower the smoothing factor `sf`, the more importance is given to old data. The higher the trend factor `tf`, the more trends in the data is considered. Both `sf` and `tf` must be between 0 and 1.'
+ ),
},
{
insertText: 'hour',
label: 'hour',
detail: 'hour(v=vector(time()) instant-vector)',
- documentation: 'Returns the hour of the day for each of the given times in UTC. Returned values are from 0 to 23.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-hour',
+ 'Returns the hour of the day for each of the given times in UTC. Returned values are from 0 to 23.'
+ ),
},
{
insertText: 'idelta',
label: 'idelta',
detail: 'idelta(v range-vector)',
- documentation:
- 'Calculates the difference between the last two samples in the range vector `v`, returning an instant vector with the given deltas and equivalent labels.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-idelta',
+ 'Calculates the difference between the last two samples in the range vector `v`, returning an instant vector with the given deltas and equivalent labels.'
+ ),
},
{
insertText: 'increase',
label: 'increase',
detail: 'increase(v range-vector)',
- documentation:
- 'Calculates the increase in the time series in the range vector. Breaks in monotonicity (such as counter resets due to target restarts) are automatically adjusted for. The increase is extrapolated to cover the full time range as specified in the range vector selector, so that it is possible to get a non-integer result even if a counter increases only by integer increments.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-increase',
+ 'Calculates the increase in the time series in the range vector. Breaks in monotonicity (such as counter resets due to target restarts) are automatically adjusted for. The increase is extrapolated to cover the full time range as specified in the range vector selector, so that it is possible to get a non-integer result even if a counter increases only by integer increments.'
+ ),
},
{
insertText: 'info',
label: 'info',
detail: 'info(v instant-vector, [data-label-selector instant-vector])',
- documentation:
- 'Returns latest details and metadata about a group of metrics, such as their labels and current values, without doing any calculations',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-info',
+ 'Returns latest details and metadata about a group of metrics, such as their labels and current values, without doing any calculations'
+ ),
},
{
insertText: 'irate',
label: 'irate',
detail: 'irate(v range-vector)',
- documentation:
- 'Calculates the per-second instant rate of increase of the time series in the range vector. This is based on the last two data points. Breaks in monotonicity (such as counter resets due to target restarts) are automatically adjusted for.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-irate',
+ 'Calculates the per-second instant rate of increase of the time series in the range vector. This is based on the last two data points. Breaks in monotonicity (such as counter resets due to target restarts) are automatically adjusted for.'
+ ),
},
{
insertText: 'label_join',
label: 'label_join',
detail:
'label_join(v instant-vector, dst_label string, separator string, src_label_1 string, src_label_2 string, ...)',
- documentation:
- 'For each timeseries in `v`, joins all the values of all the `src_labels` using `separator` and returns the timeseries with the label `dst_label` containing the joined value. There can be any number of `src_labels` in this function.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-label-join',
+ 'For each timeseries in `v`, joins all the values of all the `src_labels` using `separator` and returns the timeseries with the label `dst_label` containing the joined value. There can be any number of `src_labels` in this function.'
+ ),
},
{
insertText: 'label_replace',
label: 'label_replace',
detail: 'label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)',
- documentation:
- "For each timeseries in `v`, `label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)` matches the regular expression `regex` against the label `src_label`. If it matches, then the timeseries is returned with the label `dst_label` replaced by the expansion of `replacement`. `$1` is replaced with the first matching subgroup, `$2` with the second etc. If the regular expression doesn't match then the timeseries is returned unchanged.",
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-label-replace',
+ "For each timeseries in `v`, `label_replace(v instant-vector, dst_label string, replacement string, src_label string, regex string)` matches the regular expression `regex` against the label `src_label`. If it matches, then the timeseries is returned with the label `dst_label` replaced by the expansion of `replacement`. `$1` is replaced with the first matching subgroup, `$2` with the second etc. If the regular expression doesn't match then the timeseries is returned unchanged."
+ ),
},
{
insertText: 'ln',
label: 'ln',
detail: 'ln(v instant-vector)',
- documentation:
- 'Calculates the natural logarithm for all elements in `v`.\nSpecial cases are:\n * `ln(+Inf) = +Inf`\n * `ln(0) = -Inf`\n * `ln(x < 0) = NaN`\n * `ln(NaN) = NaN`',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-ln',
+ 'Calculates the natural logarithm for all elements in `v`.\nSpecial cases are:\n * `ln(+Inf) = +Inf`\n * `ln(0) = -Inf`\n * `ln(x < 0) = NaN`\n * `ln(NaN) = NaN`'
+ ),
},
{
insertText: 'log2',
label: 'log2',
detail: 'log2(v instant-vector)',
- documentation:
- 'Calculates the binary logarithm for all elements in `v`. The special cases are equivalent to those in `ln`.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-log2',
+ 'Calculates the binary logarithm for all elements in `v`. The special cases are equivalent to those in `ln`.'
+ ),
},
{
insertText: 'log10',
label: 'log10',
detail: 'log10(v instant-vector)',
- documentation:
- 'Calculates the decimal logarithm for all elements in `v`. The special cases are equivalent to those in `ln`.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-log10',
+ 'Calculates the decimal logarithm for all elements in `v`. The special cases are equivalent to those in `ln`.'
+ ),
},
{
insertText: 'minute',
label: 'minute',
detail: 'minute(v=vector(time()) instant-vector)',
- documentation:
- 'Returns the minute of the hour for each of the given times in UTC. Returned values are from 0 to 59.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-minute',
+ 'Returns the minute of the hour for each of the given times in UTC. Returned values are from 0 to 59.'
+ ),
},
{
insertText: 'month',
label: 'month',
detail: 'month(v=vector(time()) instant-vector)',
- documentation:
- 'Returns the month of the year for each of the given times in UTC. Returned values are from 1 to 12, where 1 means January etc.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-month',
+ 'Returns the month of the year for each of the given times in UTC. Returned values are from 1 to 12, where 1 means January etc.'
+ ),
},
{
insertText: 'pi',
label: 'pi',
detail: 'pi()',
- documentation: 'Returns pi',
+ documentation: t('grafana-prometheus.promql.getFunctions.documentation-pi', 'Returns pi'),
},
{
insertText: 'predict_linear',
label: 'predict_linear',
detail: 'predict_linear(v range-vector, t scalar)',
- documentation:
- 'Predicts the value of time series `t` seconds from now, based on the range vector `v`, using simple linear regression.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-predict-linear',
+ 'Predicts the value of time series `t` seconds from now, based on the range vector `v`, using simple linear regression.'
+ ),
},
{
insertText: 'rad',
label: 'rad',
detail: 'rad(v instant-vector)',
- documentation: 'Converts degrees to radians for all elements in v',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-rad',
+ 'Converts degrees to radians for all elements in v'
+ ),
},
{
insertText: 'rate',
label: 'rate',
detail: 'rate(v range-vector)',
- documentation:
- "Calculates the per-second average rate of increase of the time series in the range vector. Breaks in monotonicity (such as counter resets due to target restarts) are automatically adjusted for. Also, the calculation extrapolates to the ends of the time range, allowing for missed scrapes or imperfect alignment of scrape cycles with the range's time period.",
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-rate',
+ "Calculates the per-second average rate of increase of the time series in the range vector. Breaks in monotonicity (such as counter resets due to target restarts) are automatically adjusted for. Also, the calculation extrapolates to the ends of the time range, allowing for missed scrapes or imperfect alignment of scrape cycles with the range's time period."
+ ),
},
{
insertText: 'resets',
label: 'resets',
detail: 'resets(v range-vector)',
- documentation:
- 'For each input time series, `resets(v range-vector)` returns the number of counter resets within the provided time range as an instant vector. Any decrease in the value between two consecutive samples is interpreted as a counter reset.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-resets',
+ 'For each input time series, `resets(v range-vector)` returns the number of counter resets within the provided time range as an instant vector. Any decrease in the value between two consecutive samples is interpreted as a counter reset.'
+ ),
},
{
insertText: 'round',
label: 'round',
detail: 'round(v instant-vector, to_nearest=1 scalar)',
- documentation:
- 'Rounds the sample values of all elements in `v` to the nearest integer. Ties are resolved by rounding up. The optional `to_nearest` argument allows specifying the nearest multiple to which the sample values should be rounded. This multiple may also be a fraction.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-round',
+ 'Rounds the sample values of all elements in `v` to the nearest integer. Ties are resolved by rounding up. The optional `to_nearest` argument allows specifying the nearest multiple to which the sample values should be rounded. This multiple may also be a fraction.'
+ ),
},
{
insertText: 'scalar',
label: 'scalar',
detail: 'scalar(v instant-vector)',
- documentation:
- 'Given a single-element input vector, `scalar(v instant-vector)` returns the sample value of that single element as a scalar. If the input vector does not have exactly one element, `scalar` will return `NaN`.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-scalar',
+ 'Given a single-element input vector, `scalar(v instant-vector)` returns the sample value of that single element as a scalar. If the input vector does not have exactly one element, `scalar` will return `NaN`.'
+ ),
},
{
insertText: 'sgn',
label: 'sgn',
detail: 'sgn(v instant-vector)',
- documentation:
- 'Returns a vector with all sample values converted to their sign, defined as this: 1 if v is positive, -1 if v is negative and 0 if v is equal to zero.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-sgn',
+ 'Returns a vector with all sample values converted to their sign, defined as this: 1 if v is positive, -1 if v is negative and 0 if v is equal to zero.'
+ ),
},
{
insertText: 'sort',
label: 'sort',
detail: 'sort(v instant-vector)',
- documentation: 'Returns vector elements sorted by their sample values, in ascending order.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-sort',
+ 'Returns vector elements sorted by their sample values, in ascending order.'
+ ),
},
{
insertText: 'sort_desc',
label: 'sort_desc',
detail: 'sort_desc(v instant-vector)',
- documentation: 'Returns vector elements sorted by their sample values, in descending order.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-sort-desc',
+ 'Returns vector elements sorted by their sample values, in descending order.'
+ ),
},
{
insertText: 'sqrt',
label: 'sqrt',
detail: 'sqrt(v instant-vector)',
- documentation: 'Calculates the square root of all elements in `v`.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-sqrt',
+ 'Calculates the square root of all elements in `v`.'
+ ),
},
{
insertText: 'time',
label: 'time',
detail: 'time()',
- documentation:
- 'Returns the number of seconds since January 1, 1970 UTC. Note that this does not actually return the current time, but the time at which the expression is to be evaluated.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-time',
+ 'Returns the number of seconds since January 1, 1970 UTC. Note that this does not actually return the current time, but the time at which the expression is to be evaluated.'
+ ),
},
{
insertText: 'timestamp',
label: 'timestamp',
detail: 'timestamp(v instant-vector)',
- documentation:
- 'Returns the timestamp of each of the samples of the given vector as the number of seconds since January 1, 1970 UTC.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-timestamp',
+ 'Returns the timestamp of each of the samples of the given vector as the number of seconds since January 1, 1970 UTC.'
+ ),
},
{
insertText: 'vector',
label: 'vector',
detail: 'vector(s scalar)',
- documentation: 'Returns the scalar `s` as a vector with no labels.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-vector',
+ 'Returns the scalar `s` as a vector with no labels.'
+ ),
},
{
insertText: 'year',
label: 'year',
detail: 'year(v=vector(time()) instant-vector)',
- documentation: 'Returns the year for each of the given times in UTC.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-year',
+ 'Returns the year for each of the given times in UTC.'
+ ),
},
{
insertText: 'avg_over_time',
label: 'avg_over_time',
detail: 'avg_over_time(range-vector)',
- documentation: 'The average value of all points in the specified interval.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-avg-over-time',
+ 'The average value of all points in the specified interval.'
+ ),
},
{
insertText: 'min_over_time',
label: 'min_over_time',
detail: 'min_over_time(range-vector)',
- documentation: 'The minimum value of all points in the specified interval.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-min-over-time',
+ 'The minimum value of all points in the specified interval.'
+ ),
},
{
insertText: 'max_over_time',
label: 'max_over_time',
detail: 'max_over_time(range-vector)',
- documentation: 'The maximum value of all points in the specified interval.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-max-over-time',
+ 'The maximum value of all points in the specified interval.'
+ ),
},
{
insertText: 'sum_over_time',
label: 'sum_over_time',
detail: 'sum_over_time(range-vector)',
- documentation: 'The sum of all values in the specified interval.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-sum-over-time',
+ 'The sum of all values in the specified interval.'
+ ),
},
{
insertText: 'count_over_time',
label: 'count_over_time',
detail: 'count_over_time(range-vector)',
- documentation: 'The count of all values in the specified interval.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-count-over-time',
+ 'The count of all values in the specified interval.'
+ ),
},
{
insertText: 'quantile_over_time',
label: 'quantile_over_time',
detail: 'quantile_over_time(scalar, range-vector)',
- documentation: 'The φ-quantile (0 ≤ φ ≤ 1) of the values in the specified interval.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-quantile-over-time',
+ 'The φ-quantile (0 ≤ φ ≤ 1) of the values in the specified interval.'
+ ),
},
{
insertText: 'stddev_over_time',
label: 'stddev_over_time',
detail: 'stddev_over_time(range-vector)',
- documentation: 'The population standard deviation of the values in the specified interval.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-stddev-over-time',
+ 'The population standard deviation of the values in the specified interval.'
+ ),
},
{
insertText: 'stdvar_over_time',
label: 'stdvar_over_time',
detail: 'stdvar_over_time(range-vector)',
- documentation: 'The population standard variance of the values in the specified interval.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-stdvar-over-time',
+ 'The population standard variance of the values in the specified interval.'
+ ),
},
{
insertText: 'last_over_time',
label: 'last_over_time',
detail: 'last_over_time(range-vector)',
- documentation: 'The most recent point value in specified interval.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-last-over-time',
+ 'The most recent point value in specified interval.'
+ ),
},
{
insertText: 'present_over_time',
label: 'present_over_time',
detail: 'present_over_time(range-vector)',
- documentation: 'The value 1 for any series in the specified interval.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-present-over-time',
+ 'The value 1 for any series in the specified interval.'
+ ),
},
{
insertText: 'histogram_avg',
label: 'histogram_avg',
detail: 'histogram_avg(v instant-vector)',
- documentation:
- 'Returns the arithmetic average of observed values stored in a native histogram. Samples that are not native histograms are ignored and do not show up in the returned vector.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-histogram-avg',
+ 'Returns the arithmetic average of observed values stored in a native histogram. Samples that are not native histograms are ignored and do not show up in the returned vector.'
+ ),
},
{
insertText: 'histogram_count',
label: 'histogram_count',
detail: 'histogram_count(v instant-vector)',
- documentation: 'Returns the count of observations stored in a native histogram.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-histogram-count',
+ 'Returns the count of observations stored in a native histogram.'
+ ),
},
{
insertText: 'histogram_sum',
label: 'histogram_sum',
detail: 'histogram_sum(v instant-vector)',
- documentation: 'Returns the sum of observations stored in a native histogram.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-histogram-sum',
+ 'Returns the sum of observations stored in a native histogram.'
+ ),
},
{
insertText: 'histogram_fraction',
label: 'histogram_fraction',
detail: 'histogram_fraction(lower scalar, upper scalar, v instant-vector)',
- documentation: 'Returns the estimated fraction of observations between the provided lower and upper values.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-histogram-fraction',
+ 'Returns the estimated fraction of observations between the provided lower and upper values.'
+ ),
},
{
insertText: 'histogram_stddev',
label: 'histogram_stddev',
detail: 'histogram_stddev(v instant-vector)',
- documentation:
- 'Returns the estimated standard deviation of observations in a native histogram, based on the geometric mean of the buckets where the observations lie.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-histogram-stddev',
+ 'Returns the estimated standard deviation of observations in a native histogram, based on the geometric mean of the buckets where the observations lie.'
+ ),
},
{
insertText: 'histogram_stdvar',
label: 'histogram_stdvar',
detail: 'histogram_stdvar(v instant-vector)',
- documentation: 'Returns the estimated standard variance of observations in a native histogram.',
+ documentation: t(
+ 'grafana-prometheus.promql.getFunctions.documentation-histogram-stdvar',
+ 'Returns the estimated standard variance of observations in a native histogram.'
+ ),
},
];
@@ -610,7 +852,12 @@ export const promqlGrammar: Grammar = {
punctuation: /[{]/,
},
},
- function: new RegExp(`\\b(?:${FUNCTIONS.map((f) => f.label).join('|')})(?=\\s*\\()`, 'i'),
+ function: new RegExp(
+ `\\b(?:${getFunctions()
+ .map((f) => f.label)
+ .join('|')})(?=\\s*\\()`,
+ 'i'
+ ),
'context-range': [
{
pattern: /\[[^\]]*(?=])/, // [1m]
diff --git a/packages/grafana-prometheus/src/querybuilder/PromQueryModeller.ts b/packages/grafana-prometheus/src/querybuilder/PromQueryModeller.ts
index caf90017526..9286382d7eb 100644
--- a/packages/grafana-prometheus/src/querybuilder/PromQueryModeller.ts
+++ b/packages/grafana-prometheus/src/querybuilder/PromQueryModeller.ts
@@ -1,5 +1,5 @@
// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/PromQueryModeller.ts
-import { FUNCTIONS } from '../promql';
+import { getFunctions } from '../promql';
import { getAggregationOperations } from './aggregations';
import { getOperationDefinitions } from './operations';
@@ -16,7 +16,7 @@ export class PromQueryModeller extends PromQueryModellerBase implements PromQuer
super(() => {
const allOperations = [...getOperationDefinitions(), ...getAggregationOperations()];
for (const op of allOperations) {
- const func = FUNCTIONS.find((x) => x.insertText === op.id);
+ const func = getFunctions().find((x) => x.insertText === op.id);
if (func) {
op.documentation = func.documentation;
}
diff --git a/packages/grafana-prometheus/src/querybuilder/operationUtils.ts b/packages/grafana-prometheus/src/querybuilder/operationUtils.ts
index 00f9bc72b0c..227621b1734 100644
--- a/packages/grafana-prometheus/src/querybuilder/operationUtils.ts
+++ b/packages/grafana-prometheus/src/querybuilder/operationUtils.ts
@@ -3,6 +3,7 @@ import { capitalize } from 'lodash';
import pluralize from 'pluralize';
import { SelectableValue } from '@grafana/data';
+import { t } from '@grafana/i18n';
import {
QueryBuilderLabelFilter,
@@ -265,11 +266,23 @@ export function getAggregationExplainer(aggregationName: string, mode: 'by' | 'w
switch (mode) {
case 'by':
- return `Calculates ${aggregationName} over dimensions while preserving ${labelWord} ${labels}.`;
+ return t(
+ 'grafana-prometheus.querybuilder.operation-utils.getAggregationExplainer.label-by',
+ 'Calculates {{aggregationName}} over dimensions while preserving {{labelWord}} {{labels}}.',
+ { aggregationName, labelWord, labels }
+ );
case 'without':
- return `Calculates ${aggregationName} over the dimensions ${labels}. All other labels are preserved.`;
+ return t(
+ 'grafana-prometheus.querybuilder.operation-utils.getAggregationExplainer.label-without',
+ 'Calculates {{aggregationName}} over the dimensions {{labels}}. All other labels are preserved.',
+ { aggregationName, labels }
+ );
default:
- return `Calculates ${aggregationName} over the dimensions.`;
+ return t(
+ 'grafana-prometheus.querybuilder.operation-utils.getAggregationExplainer.label-default',
+ 'Calculates {{aggregationName}} over the dimensions.',
+ { aggregationName }
+ );
}
};
}
diff --git a/packages/grafana-prometheus/src/resource_clients.test.ts b/packages/grafana-prometheus/src/resource_clients.test.ts
index f919615b44e..4a2790227ee 100644
--- a/packages/grafana-prometheus/src/resource_clients.test.ts
+++ b/packages/grafana-prometheus/src/resource_clients.test.ts
@@ -836,6 +836,11 @@ describe('BaseResourceClient', () => {
constructor() {
super(mockRequest, mockDatasource);
}
+
+ // Expose protected method for testing
+ public testGetEffectiveLimit(limit?: number): number {
+ return this.getEffectiveLimit(limit);
+ }
}
let client: TestBaseResourceClient;
@@ -845,6 +850,26 @@ describe('BaseResourceClient', () => {
client = new TestBaseResourceClient();
});
+ describe('getEffectiveLimit', () => {
+ it('should return the provided limit when a number is given', () => {
+ expect(client.testGetEffectiveLimit(1000)).toBe(1000);
+ expect(client.testGetEffectiveLimit(500)).toBe(500);
+ expect(client.testGetEffectiveLimit(100000)).toBe(100000);
+ });
+
+ it('should return 0 when limit is 0 (valid for unlimited)', () => {
+ expect(client.testGetEffectiveLimit(0)).toBe(0);
+ });
+
+ it('should return datasource seriesLimit when limit is undefined', () => {
+ expect(client.testGetEffectiveLimit(undefined)).toBe(DEFAULT_SERIES_LIMIT);
+ });
+
+ it('should return datasource seriesLimit when no limit is provided', () => {
+ expect(client.testGetEffectiveLimit()).toBe(DEFAULT_SERIES_LIMIT);
+ });
+ });
+
describe('querySeries', () => {
const mockTimeRange = {
from: dateTime(1681300292392),
diff --git a/packages/grafana-prometheus/src/resource_clients.ts b/packages/grafana-prometheus/src/resource_clients.ts
index cc59213cf47..2eb4a6b2ce0 100644
--- a/packages/grafana-prometheus/src/resource_clients.ts
+++ b/packages/grafana-prometheus/src/resource_clients.ts
@@ -43,8 +43,16 @@ export abstract class BaseResourceClient {
this.seriesLimit = this.datasource.seriesLimit;
}
+ /**
+ * Returns the effective limit to use for API requests.
+ * Uses the provided limit if specified, otherwise falls back to the datasource's configured series limit.
+ * When zero is provided, it returns zero (which means no limit in Prometheus API).
+ *
+ * @param {number} [limit] - Optional limit parameter from the API call
+ * @returns {number} The limit to use - either the provided limit or datasource's default series limit
+ */
protected getEffectiveLimit(limit?: number): number {
- return limit || this.seriesLimit;
+ return limit ?? this.seriesLimit;
}
protected async requestLabels(
@@ -93,10 +101,23 @@ export class LabelsApiClient extends BaseResourceClient implements ResourceApiCl
this.labelKeys = await this.queryLabelKeys(timeRange);
};
- public queryMetrics = async (timeRange: TimeRange): Promise<{ metrics: string[]; histogramMetrics: string[] }> => {
- this.metrics = await this.queryLabelValues(timeRange, METRIC_LABEL);
+ /**
+ * Fetches all available metrics from Prometheus using the labels values endpoint for __name__.
+ * Also processes and identifies histogram metrics (those ending with '_bucket').
+ * Results are cached and stored in the client instance for future use.
+ *
+ * @param {TimeRange} timeRange - Time range to search for metrics
+ * @param {number} [limit] - Optional maximum number of metrics to return, uses datasource default if not specified
+ * @returns {Promise<{metrics: string[], histogramMetrics: string[]}>} Object containing all metrics and filtered histogram metrics
+ */
+ public queryMetrics = async (
+ timeRange: TimeRange,
+ limit?: number
+ ): Promise<{ metrics: string[]; histogramMetrics: string[] }> => {
+ const effectiveLimit = this.getEffectiveLimit(limit);
+ this.metrics = await this.queryLabelValues(timeRange, METRIC_LABEL, undefined, effectiveLimit);
this.histogramMetrics = processHistogramMetrics(this.metrics);
- this._cache.setLabelValues(timeRange, undefined, DEFAULT_SERIES_LIMIT, this.metrics);
+ this._cache.setLabelValues(timeRange, undefined, effectiveLimit, this.metrics);
return { metrics: this.metrics, histogramMetrics: this.histogramMetrics };
};
diff --git a/packages/grafana-runtime/package.json b/packages/grafana-runtime/package.json
index 3d129df19ae..f32cc4639da 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": "12.1.0-pre",
+ "version": "12.2.0-pre",
"description": "Grafana Runtime Library",
"keywords": [
"grafana",
@@ -53,11 +53,11 @@
"postpack": "mv package.json.bak package.json && rimraf ./unstable"
},
"dependencies": {
- "@grafana/data": "12.1.0-pre",
- "@grafana/e2e-selectors": "12.1.0-pre",
+ "@grafana/data": "12.2.0-pre",
+ "@grafana/e2e-selectors": "12.2.0-pre",
"@grafana/faro-web-sdk": "^1.13.2",
- "@grafana/schema": "12.1.0-pre",
- "@grafana/ui": "12.1.0-pre",
+ "@grafana/schema": "12.2.0-pre",
+ "@grafana/ui": "12.2.0-pre",
"@types/systemjs": "6.15.3",
"history": "4.10.1",
"lodash": "4.17.21",
@@ -71,20 +71,20 @@
"@rollup/plugin-node-resolve": "16.0.1",
"@rollup/plugin-terser": "0.4.4",
"@testing-library/dom": "10.4.0",
- "@testing-library/react": "16.2.0",
+ "@testing-library/react": "16.3.0",
"@testing-library/user-event": "14.6.1",
"@types/history": "4.7.11",
"@types/jest": "29.5.14",
"@types/lodash": "4.17.20",
"@types/react": "18.3.18",
"@types/react-dom": "18.3.5",
- "esbuild": "0.25.6",
+ "esbuild": "0.25.8",
"lodash": "4.17.21",
"react": "18.3.1",
"react-dom": "18.3.1",
"rimraf": "6.0.1",
"rollup": "^4.22.4",
- "rollup-plugin-esbuild": "6.2.0",
+ "rollup-plugin-esbuild": "6.2.1",
"rollup-plugin-node-externals": "^8.0.0",
"rollup-plugin-sourcemaps": "0.6.3",
"typescript": "5.8.3"
diff --git a/packages/grafana-runtime/rollup.config.ts b/packages/grafana-runtime/rollup.config.ts
index 7255b34b0d5..5807c919136 100644
--- a/packages/grafana-runtime/rollup.config.ts
+++ b/packages/grafana-runtime/rollup.config.ts
@@ -10,10 +10,12 @@ export default [
input: entryPoint,
plugins,
output: [cjsOutput(pkg), esmOutput(pkg, 'grafana-runtime')],
+ treeshake: false,
},
{
input: 'src/unstable.ts',
plugins,
output: [cjsOutput(pkg), esmOutput(pkg, 'grafana-runtime')],
+ treeshake: false,
},
];
diff --git a/packages/grafana-runtime/src/services/pluginExtensions/utils.test.tsx b/packages/grafana-runtime/src/services/pluginExtensions/utils.test.tsx
index e235aace668..14f1a9082be 100644
--- a/packages/grafana-runtime/src/services/pluginExtensions/utils.test.tsx
+++ b/packages/grafana-runtime/src/services/pluginExtensions/utils.test.tsx
@@ -92,7 +92,11 @@ describe('Plugin Extensions / Utils', () => {
// Check if the right components are selected
const limitedComponents = getLimitedComponentsToRender({ props, components, limit: 3 });
const rendered = render(
- <>{limitedComponents?.map((Component, index) => )}>
+ <>
+ {limitedComponents?.map((Component, index) => (
+
+ ))}
+ >
);
expect(rendered.getByText('Test 1')).toBeInTheDocument();
@@ -127,7 +131,11 @@ describe('Plugin Extensions / Utils', () => {
// Check if the right components are selected
const limitedComponents = getLimitedComponentsToRender({ props, components, limit: 1 });
const rendered = render(
- <>{limitedComponents?.map((Component, index) => )}>
+ <>
+ {limitedComponents?.map((Component, index) => (
+
+ ))}
+ >
);
expect(rendered.getByText('Test 1')).toBeInTheDocument();
@@ -158,7 +166,11 @@ describe('Plugin Extensions / Utils', () => {
pluginId: ['plugin-id-2', 'plugin-id-3'],
});
const rendered = render(
- <>{limitedComponents?.map((Component, index) => )}>
+ <>
+ {limitedComponents?.map((Component, index) => (
+
+ ))}
+ >
);
expect(rendered.getByText('Test 2')).toBeInTheDocument();
diff --git a/packages/grafana-schema/package.json b/packages/grafana-schema/package.json
index 8dc2e5efe1f..9896376d716 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": "12.1.0-pre",
+ "version": "12.2.0-pre",
"description": "Grafana Schema Library",
"keywords": [
"typescript"
@@ -38,11 +38,11 @@
"devDependencies": {
"@grafana/tsconfig": "^2.0.0",
"@rollup/plugin-node-resolve": "16.0.1",
- "esbuild": "0.25.6",
+ "esbuild": "0.25.8",
"glob": "^11.0.0",
"rimraf": "6.0.1",
"rollup": "^4.22.4",
- "rollup-plugin-esbuild": "6.2.0",
+ "rollup-plugin-esbuild": "6.2.1",
"rollup-plugin-node-externals": "^8.0.0",
"typescript": "5.8.3"
},
diff --git a/packages/grafana-schema/rollup.config.ts b/packages/grafana-schema/rollup.config.ts
index e274b31df26..04928f75c47 100644
--- a/packages/grafana-schema/rollup.config.ts
+++ b/packages/grafana-schema/rollup.config.ts
@@ -16,6 +16,7 @@ export default [
input: entryPoint,
plugins,
output: [cjsOutput(pkg), esmOutput(pkg, 'grafana-schema')],
+ treeshake: false,
},
{
input: Object.fromEntries(
@@ -45,5 +46,6 @@ export default [
format: 'esm',
dir: path.dirname(pkg.publishConfig.module),
},
+ treeshake: false,
},
];
diff --git a/packages/grafana-schema/src/common/common.gen.ts b/packages/grafana-schema/src/common/common.gen.ts
index 7efc5e3ff60..b98c83c9525 100644
--- a/packages/grafana-schema/src/common/common.gen.ts
+++ b/packages/grafana-schema/src/common/common.gen.ts
@@ -882,6 +882,16 @@ export type TimeZoneUtc = 'utc';
*/
export type TimeZoneBrowser = 'browser';
+/**
+ * Options for time comparison
+ */
+export interface TimeCompareOptions {
+ /**
+ * Enable time comparison control
+ */
+ timeCompare?: boolean;
+}
+
/**
* Optional formats for the template variable replace functions
* See also https://grafana.com/docs/grafana/latest/dashboards/variables/variable-syntax/#advanced-variable-format-options
diff --git a/packages/grafana-schema/src/common/timecompare.cue b/packages/grafana-schema/src/common/timecompare.cue
new file mode 100644
index 00000000000..b85287c9301
--- /dev/null
+++ b/packages/grafana-schema/src/common/timecompare.cue
@@ -0,0 +1,7 @@
+package common
+
+// Options for time comparison
+TimeCompareOptions: {
+ // Enable time comparison control
+ timeCompare?: bool
+} @cuetsy(kind="interface")
\ No newline at end of file
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 6d79fbeceb8..63bb4339949 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
@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
export interface Options {
limit: number;
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 1bc5ff0f497..59924a010ae 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
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
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 4345b7fae05..c086da202b8 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
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
export interface Options extends common.OptionsWithLegend, 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 ee96c69c0a9..ea817787d65 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
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
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 84c0c84408d..983129db72b 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
@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
export enum HorizontalConstraint {
Center = 'center',
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 9f339bc8cc4..f0e4394451d 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
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
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 328429a5829..1348c30dbad 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
@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
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 99b9e516dba..d8db9ef7edf 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
@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
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 6967fd64ccb..811836dff43 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
@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
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 7cac1eab340..dfb50c2c981 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
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
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 abe40c63645..36aa14da169 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
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
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 14a718cf6d9..0a085d8ec6e 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
@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
export interface Options {
basemap: ui.MapLayerOptions;
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 b87a6c3897f..b0a2a2b5233 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
@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
/**
* 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 819bb518581..59b82823d78 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
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
export interface Options extends common.OptionsWithLegend, common.OptionsWithTooltip {
/**
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 956bff430f7..da04269f0b3 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
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
export interface Options {
controlsStorageKey?: string;
@@ -24,6 +24,7 @@ export interface Options {
logLineMenuCustomItems?: unknown;
logRowMenuIconsAfter?: unknown;
logRowMenuIconsBefore?: unknown;
+ noInteractions?: boolean;
/**
* TODO: figure out how to define callbacks
*/
diff --git a/packages/grafana-schema/src/raw/composable/logsnew/panelcfg/x/LogsNewPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/logsnew/panelcfg/x/LogsNewPanelCfg_types.gen.ts
index 13e0ad8c692..2b64bba333e 100644
--- a/packages/grafana-schema/src/raw/composable/logsnew/panelcfg/x/LogsNewPanelCfg_types.gen.ts
+++ b/packages/grafana-schema/src/raw/composable/logsnew/panelcfg/x/LogsNewPanelCfg_types.gen.ts
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
export interface Options {
controlsStorageKey?: string;
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 c86b8b987f7..eb0b74331d4 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
@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
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 10f74d337b8..a5e4657464a 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
@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
export interface ArcOption {
/**
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 5061e824e18..c5f420a0b11 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
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
/**
* Select the pie chart display style.
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 3f290835b85..8296f089a14 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
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
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 40af7a986a7..58b487eb4d3 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
@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
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 d0cc207400b..0ddf8a30c7a 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
@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
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 2529b11f635..fe36790fe55 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
@@ -10,7 +10,7 @@
import * as ui from '@grafana/schema';
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
export interface Options {
/**
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 b97546048d7..4fbda90032b 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
@@ -8,7 +8,7 @@
//
// Run 'make gen-cue' from repository root to regenerate.
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
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 b34b0b7e301..30349a9ff9c 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
@@ -10,11 +10,12 @@
import * as common from '@grafana/schema';
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
export interface Options extends common.OptionsWithTimezones {
legend: common.VizLegendOptions;
orientation?: common.VizOrientation;
+ timeCompare?: common.TimeCompareOptions;
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 9d3946018df..aa3b48c20ab 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
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
/**
* 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 35b7fdfd4e5..13516a37619 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
@@ -10,7 +10,7 @@
import * as common from '@grafana/schema';
-export const pluginVersion = "12.1.0-pre";
+export const pluginVersion = "12.2.0-pre";
export enum PointShape {
Circle = 'circle',
diff --git a/packages/grafana-sql/package.json b/packages/grafana-sql/package.json
index 2068a48f9de..574d940a658 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": "12.1.0-pre",
+ "version": "12.2.0-pre",
"repository": {
"type": "git",
"url": "http://github.com/grafana/grafana.git",
@@ -16,12 +16,12 @@
},
"dependencies": {
"@emotion/css": "11.13.5",
- "@grafana/data": "12.1.0-pre",
- "@grafana/e2e-selectors": "12.1.0-pre",
- "@grafana/i18n": "12.1.0-pre",
+ "@grafana/data": "12.2.0-pre",
+ "@grafana/e2e-selectors": "12.2.0-pre",
+ "@grafana/i18n": "12.2.0-pre",
"@grafana/plugin-ui": "0.10.7",
- "@grafana/runtime": "12.1.0-pre",
- "@grafana/ui": "12.1.0-pre",
+ "@grafana/runtime": "12.2.0-pre",
+ "@grafana/ui": "12.2.0-pre",
"@react-awesome-query-builder/ui": "6.6.15",
"immutable": "5.1.3",
"lodash": "4.17.21",
@@ -39,11 +39,11 @@
"@grafana/tsconfig": "^2.0.0",
"@testing-library/dom": "10.4.0",
"@testing-library/jest-dom": "^6.1.2",
- "@testing-library/react": "16.2.0",
+ "@testing-library/react": "16.3.0",
"@testing-library/user-event": "14.6.1",
"@types/jest": "^29.5.4",
"@types/lodash": "4.17.20",
- "@types/node": "22.15.0",
+ "@types/node": "22.16.5",
"@types/react": "18.3.18",
"@types/react-dom": "18.3.5",
"@types/react-virtualized-auto-sizer": "1.0.8",
diff --git a/packages/grafana-sql/src/locales/de-DE/grafana-sql.json b/packages/grafana-sql/src/locales/de-DE/grafana-sql.json
index 5f921f12dba..152cc9af15b 100644
--- a/packages/grafana-sql/src/locales/de-DE/grafana-sql.json
+++ b/packages/grafana-sql/src/locales/de-DE/grafana-sql.json
@@ -2,26 +2,26 @@
"grafana-sql": {
"components": {
"confirm-modal": {
- "builder-mode": "",
+ "builder-mode": "Im Builder-Modus werden keine am Code vorgenommenen Änderungen angezeigt. Der Abfrage-Builder zeigt Ihre letzten Änderungen im Builder-Modus an.",
"cancel": "Abbrechen",
- "clipboard": "",
- "copy-code-and-switch": "",
- "discard-code-and-switch": "",
+ "clipboard": "Möchten Sie Ihren Code in die Zwischenablage kopieren?",
+ "copy-code-and-switch": "Code kopieren und wechseln",
+ "discard-code-and-switch": "Code verwerfen und wechseln",
"warning": "Warnung"
},
"connection-limits": {
- "auto-max-idle": "",
- "content-auto-max-idle": "",
- "content-max-idle": "",
- "content-max-lifetime": "",
- "content-max-open": "",
- "max-idle": "",
- "max-lifetime": "",
- "max-open": "",
- "title-connection-limits": ""
+ "auto-max-idle": "Auto. max. inaktiv",
+ "content-auto-max-idle": "Wenn dies aktiviert ist, wird die Anzahl der <1>Maximalen inaktiven Verbindungen1> automatisch auf den gleichen Wert der<3> Maximalen offenen Verbindungen3> festgelegt. Wenn die Anzahl der maximalen offenen Verbindungen nicht festgelegt ist, wird sie auf den Standardwert ({{defaultMaxIdle}}) eingestellt.",
+ "content-max-idle": "Die maximale Anzahl der Verbindungen im Pool der inaktiven Verbindungen. Wenn <1>Maximale offene Verbindungen1> größer ist als 0, aber kleiner als die Anzahl der <3>Maximalen inaktiven Verbindungen3>, werden die <5>Maximalen inaktiven Verbindungen5> verringert, um der Grenze für die Anzahl der <8>Maximalen offenen Verbindungen8> zu entsprechen. Wenn der Wert auf 0 eingestellt ist, werden keine inaktiven Verbindungen beibehalten.",
+ "content-max-lifetime": "Die maximale Zeitdauer der Wiederverwendung einer Verbindung in Sekunden. Bei einer Einstellung auf 0 werden Verbindungen immer wiederverwendet.",
+ "content-max-open": "Die maximale Anzahl offener Verbindungen zur Datenbank. Wenn <1>Maximale inaktive Verbindungen1> größer als 0 ist und die Anzahl der <3>Maximalen offenen Verbindungen3> kleiner als die Anzahl der <5>Maximalen inaktiven Verbindungen5> ist, werden die <7>Maximalen inaktiven Verbindungen7> bis zur Grenze für <9>Maximale offene Verbindungen9> verringert. Wenn 0 festgelegt ist, gibt es keine Begrenzung der Anzahl offener Verbindungen.",
+ "max-idle": "Max. inaktiv",
+ "max-lifetime": "Max. Lebensdauer",
+ "max-open": "Max. offen",
+ "title-connection-limits": "Verbindungsbegrenzungen"
},
"dataset-selector": {
- "aria-label-dataset-selector": ""
+ "aria-label-dataset-selector": "Datensatz-Selektor"
},
"error-boundary": {
"fall-back": {
@@ -31,21 +31,21 @@
"get-custom-operators": {
"custom-operators": {
"label": {
- "macros": ""
+ "macros": "Macros"
}
}
},
"make-render-column": {
"render-column": {
"aria-label-group-by": "Gruppieren nach",
- "title-remove-group-by-column": ""
+ "title-remove-group-by-column": "Nach Spalte gruppieren entfernen"
}
},
"order-by-row": {
- "aria-label-order-by": "",
+ "aria-label-order-by": "Sortieren nach",
"label-limit": "Limit",
- "label-offset": "",
- "label-order-by": ""
+ "label-offset": "Offset",
+ "label-order-by": "Sortieren nach"
},
"preview": {
"label-element": {
@@ -54,100 +54,100 @@
}
},
"query-header": {
- "content-invalid-query": "",
+ "content-invalid-query": "Ihre Abfrage ist ungültig. Weitere Informationen finden Sie unten. <1>1>Sie können diese Abfrage aber trotzdem ausführen.",
"editor-modes": {
"label-builder": "",
"label-code": ""
},
- "label-dataset": "",
+ "label-dataset": "Datensatz",
"label-filter": "Filter",
"label-format": "Format",
"label-group": "Gruppe",
- "label-order": "",
+ "label-order": "Reihenfolge",
"label-preview": "Vorschau",
"label-table": "Tabelle",
- "placeholder-select-format": "",
+ "placeholder-select-format": "Format auswählen",
"run-query": "Abfrage ausführen"
},
"query-toolbox": {
- "content-hit-ctrlcmdreturn-to-run-query": "",
- "tooltip-collapse": "",
- "tooltip-expand": "",
- "tooltip-format-query": ""
+ "content-hit-ctrlcmdreturn-to-run-query": "Drücken Sie STRG/CMD+Eingabe, um die Abfrage auszuführen",
+ "tooltip-collapse": "Editor einklappen",
+ "tooltip-expand": "Editor ausklappen",
+ "tooltip-format-query": "Formatabfrage"
},
"query-validator": {
- "query-will-process": "",
- "validating-query": ""
+ "query-will-process": "<0>0> Diese Abfrage verarbeitet <2>{{bytes}}2>, wenn sie ausgeführt wird.",
+ "validating-query": "Abfrage wird validiert …"
},
"raw-editor": {
"render-placeholder": {
- "editing-in-expanded-code-editor": ""
+ "editing-in-expanded-code-editor": "Bearbeitung im ausgeklappten Code-Editor"
},
- "title-query-num": ""
+ "title-query-num": "Abfrage {{queryNum}}"
},
"select-column": {
"label-column": "Spalte"
},
"select-custom-function-parameters": {
- "aria-label-parameter": "",
+ "aria-label-parameter": "Parameter {{index}} für Spalte {{columnIndex}}",
"render-parameters": {
"params": {
- "title-remove-parameter": ""
+ "title-remove-parameter": "Parameter entfernen"
}
},
- "title-add-parameter": ""
+ "title-add-parameter": "Parameter hinzufügen"
},
"select-row": {
"aggregate-options": {
"options": {
"label": {
- "aggregations": "",
- "macros": ""
+ "aggregations": "Aggregationen",
+ "macros": "Macros"
}
}
},
"label": {
- "time": "",
+ "time": "Zeit",
"value": "Wert"
},
"label-alias": "Alias",
- "label-data-operations": "",
- "title-add-column": "",
- "title-remove-column": ""
+ "label-data-operations": "Datenoperationen",
+ "title-add-column": "Spalte hinzufügen",
+ "title-remove-column": "Spalte entfernen"
},
"settings": {
- "aria-label-conjunction": "",
+ "aria-label-conjunction": "Konjunktion",
"aria-label-field": "Feld",
"aria-label-operator": "Bediener",
- "title-button-filter": ""
+ "title-button-filter": "{{ buttonLabel }} Filter"
},
"sql-query-editor-lazy": {
"text-loading-editor": "Editor wird geladen"
},
"table-selector": {
- "aria-label-table-selector": "",
- "placeholder-loading": "",
- "placeholder-select-table": ""
+ "aria-label-table-selector": "Tabellenselektor",
+ "placeholder-loading": "Tabellen werden geladen",
+ "placeholder-select-table": "Tabelle auswählen"
},
"tlssecrets-config": {
- "content-tlsssl-client-certificate": "",
- "content-tlsssl-client-key": "",
- "content-tlsssl-root-certificate": "",
- "tlsssl-client-certificate": "",
- "tlsssl-client-key": "",
+ "content-tlsssl-client-certificate": "Stellen Sie zur Authentifizierung mit einem TLS/SSL-Client-Zertifikat bitte hier das Client-Zertifikat bereit.",
+ "content-tlsssl-client-key": "Stellen Sie zur Authentifizierung mit einem Client-TLS/SSL-Zertifikat bitte hier den Schlüssel bereit.",
+ "content-tlsssl-root-certificate": "Wenn der ausgewählte TLS/SSL-Modus ein Server-Root-Zertifikat erfordert, stellen Sie es bitte hier bereit",
+ "tlsssl-client-certificate": "TLS/SSL-Client-Zertifikat",
+ "tlsssl-client-key": "TLS/SSL-Clientschlüssel",
"tlsssl-root-certificate": "TLS/SSL-Root-Zertifikat"
},
"visual-editor": {
- "label-filter-by-column-value": "",
- "label-group-by-column": ""
+ "label-filter-by-column-value": "Nach Spaltenwert filtern",
+ "label-group-by-column": "Nach Spalte gruppieren"
},
"widgets": {
- "aria-label-macros-value-selector": ""
+ "aria-label-macros-value-selector": "Macros-Wert-Selektor"
}
},
"utils": {
"get-columns-width-indices": {
- "label-selected-columns": ""
+ "label-selected-columns": "Ausgewählte Spalten"
}
}
}
diff --git a/packages/grafana-sql/src/locales/hu-HU/grafana-sql.json b/packages/grafana-sql/src/locales/hu-HU/grafana-sql.json
index 0c1803084cb..bb168d14c87 100644
--- a/packages/grafana-sql/src/locales/hu-HU/grafana-sql.json
+++ b/packages/grafana-sql/src/locales/hu-HU/grafana-sql.json
@@ -2,26 +2,26 @@
"grafana-sql": {
"components": {
"confirm-modal": {
- "builder-mode": "",
+ "builder-mode": "Az építő mód nem jeleníti meg a kódban végzett módosításokat. A lekérdezésépítő megjeleníti az utolsó módosításokat, amelyeket az építő módban végzett.",
"cancel": "Mégse",
- "clipboard": "",
- "copy-code-and-switch": "",
- "discard-code-and-switch": "",
+ "clipboard": "Szeretné a kódot a vágólapra másolni?",
+ "copy-code-and-switch": "Kód másolása és váltás",
+ "discard-code-and-switch": "Kód elvetése és váltás",
"warning": "Figyelmeztetés"
},
"connection-limits": {
- "auto-max-idle": "",
- "content-auto-max-idle": "",
- "content-max-idle": "",
- "content-max-lifetime": "",
- "content-max-open": "",
- "max-idle": "",
- "max-lifetime": "",
- "max-open": "",
- "title-connection-limits": ""
+ "auto-max-idle": "Inaktív automatikus maximális száma",
+ "content-auto-max-idle": "Ha engedélyezve van, automatikusan beállítja az <1>Inaktív kapcsolatok maximális száma1> értéket a <3>Megnyitott kapcsolatok maximális száma3> értékére. Ha a nyitott kapcsolatok maximális száma nincs beállítva, akkor az alapértelmezett értékre lesz beállítva ({{defaultMaxIdle}}).",
+ "content-max-idle": "Az inaktív kapcsolatok készletében lévő kapcsolatok maximális száma. Ha a <1>Megnyitott kapcsolatok maximális száma1> nagyobb, mint 0, de kisebb, mint az <3>Inaktív kapcsolatok maximális száma3>, akkor az <5>Inaktív kapcsolatok maximális száma5> csökken, hogy megfeleljen a <8>Megnyitott kapcsolatok maximális száma8> határértékének. Ha 0-ra van állítva, akkor egyetlen inaktív kapcsolat sem marad meg.",
+ "content-max-lifetime": "A csatlakozás újrafelhasználásának maximális időtartama másodpercben. Ha 0-ra van állítva, a kapcsolatok újrafelhasználása végtelen.",
+ "content-max-open": "Az adatbázishoz irányuló nyitott kapcsolatok maximális száma. Ha az <1>Inaktív kapcsolatok maximális száma1> nagyobb, mint 0, és a <3>Megnyitott kapcsolatok maximális száma3> kisebb, mint az <5>Inaktív kapcsolatok maximális száma5>, akkor az <7>Inaktív kapcsolatok maximális száma7> csökken, hogy megfeleljen a <9>Megnyitott kapcsolatok maximális száma9> határértékének. Ha 0-ra van állítva, akkor nincs korlátozva a nyitott kapcsolatok száma.",
+ "max-idle": "Max. inaktív",
+ "max-lifetime": "Max. élettartam",
+ "max-open": "Max. nyitott",
+ "title-connection-limits": "Kapcsolati korlátozások"
},
"dataset-selector": {
- "aria-label-dataset-selector": ""
+ "aria-label-dataset-selector": "Adatkészlet-választó"
},
"error-boundary": {
"fall-back": {
@@ -31,21 +31,21 @@
"get-custom-operators": {
"custom-operators": {
"label": {
- "macros": ""
+ "macros": "Makrók"
}
}
},
"make-render-column": {
"render-column": {
"aria-label-group-by": "Csoportosítási szempont",
- "title-remove-group-by-column": ""
+ "title-remove-group-by-column": "Csoport eltávolítása oszlop szerint"
}
},
"order-by-row": {
- "aria-label-order-by": "",
+ "aria-label-order-by": "Rendezési szempont",
"label-limit": "Korlát",
- "label-offset": "",
- "label-order-by": ""
+ "label-offset": "Eltolás",
+ "label-order-by": "Rendezési szempont"
},
"preview": {
"label-element": {
@@ -54,100 +54,100 @@
}
},
"query-header": {
- "content-invalid-query": "",
+ "content-invalid-query": "A lekérdezés érvénytelen. A részleteket tekintse meg alább. <1>1>Ezt a lekérdezést azonban továbbra is futtathatja.",
"editor-modes": {
"label-builder": "",
"label-code": ""
},
- "label-dataset": "",
+ "label-dataset": "Adatkészlet",
"label-filter": "Szűrő",
"label-format": "Formátum",
"label-group": "Csoport",
- "label-order": "",
+ "label-order": "Sorrend",
"label-preview": "Előnézet",
"label-table": "Táblázat",
- "placeholder-select-format": "",
+ "placeholder-select-format": "Formátum kiválasztása",
"run-query": "Lekérdezés"
},
"query-toolbox": {
- "content-hit-ctrlcmdreturn-to-run-query": "",
- "tooltip-collapse": "",
- "tooltip-expand": "",
- "tooltip-format-query": ""
+ "content-hit-ctrlcmdreturn-to-run-query": "A lekérdezés futtatásához nyomja le a CTRL/CMD+Enter billentyűkombinációt",
+ "tooltip-collapse": "Szerkesztő összecsukása",
+ "tooltip-expand": "Szerkesztő kibontása",
+ "tooltip-format-query": "Lekérdezés formázása"
},
"query-validator": {
- "query-will-process": "",
- "validating-query": ""
+ "query-will-process": "<0>0> Ez a lekérdezés <2>{{bytes}}2> feldolgozását végzi futtatáskor.",
+ "validating-query": "Lekérdezés érvényesítése…"
},
"raw-editor": {
"render-placeholder": {
- "editing-in-expanded-code-editor": ""
+ "editing-in-expanded-code-editor": "Szerkesztés kibontott kódszerkesztőben"
},
- "title-query-num": ""
+ "title-query-num": "{{queryNum}}. lekérdezés"
},
"select-column": {
"label-column": "Oszlop"
},
"select-custom-function-parameters": {
- "aria-label-parameter": "",
+ "aria-label-parameter": "{{columnIndex}}. oszlop {{index}}. paramétere",
"render-parameters": {
"params": {
- "title-remove-parameter": ""
+ "title-remove-parameter": "Paraméter eltávolítása"
}
},
- "title-add-parameter": ""
+ "title-add-parameter": "Paraméter hozzáadása"
},
"select-row": {
"aggregate-options": {
"options": {
"label": {
- "aggregations": "",
- "macros": ""
+ "aggregations": "Összegzések",
+ "macros": "Makrók"
}
}
},
"label": {
- "time": "",
+ "time": "idő",
"value": "érték"
},
"label-alias": "Alias",
- "label-data-operations": "",
- "title-add-column": "",
- "title-remove-column": ""
+ "label-data-operations": "Adatműveletek",
+ "title-add-column": "Oszlop hozzáadása",
+ "title-remove-column": "Oszlop eltávolítása"
},
"settings": {
- "aria-label-conjunction": "",
+ "aria-label-conjunction": "Összekötés",
"aria-label-field": "Mező",
"aria-label-operator": "Műveleti jel",
- "title-button-filter": ""
+ "title-button-filter": "{{ buttonLabel }} szűrő"
},
"sql-query-editor-lazy": {
"text-loading-editor": "Szerkesztő betöltése"
},
"table-selector": {
- "aria-label-table-selector": "",
- "placeholder-loading": "",
- "placeholder-select-table": ""
+ "aria-label-table-selector": "Táblázatválasztó",
+ "placeholder-loading": "Táblázatok betöltése",
+ "placeholder-select-table": "Táblázat kiválasztása"
},
"tlssecrets-config": {
- "content-tlsssl-client-certificate": "",
- "content-tlsssl-client-key": "",
- "content-tlsssl-root-certificate": "",
- "tlsssl-client-certificate": "",
- "tlsssl-client-key": "",
+ "content-tlsssl-client-certificate": "A TLS-/SSL-klienstanúsítvánnyal történő hitelesítéshez adja meg itt a klienstanúsítványt.",
+ "content-tlsssl-client-key": "A TLS-/SSL-klienstanúsítvánnyal történő hitelesítéshez adja meg itt a kulcsot.",
+ "content-tlsssl-root-certificate": "Ha a kiválasztott TLS-/SSL-módhoz kiszolgáló-gyökértanúsítvány szükséges, adja meg itt",
+ "tlsssl-client-certificate": "TLS-/SSL-klienstanúsítvány",
+ "tlsssl-client-key": "TLS-/SSL-klienskulcs",
"tlsssl-root-certificate": "TLS-/SSL-gyökértanúsítvány"
},
"visual-editor": {
- "label-filter-by-column-value": "",
- "label-group-by-column": ""
+ "label-filter-by-column-value": "Szűrés oszlopérték szerint",
+ "label-group-by-column": "Csoportosítás oszlop szerint"
},
"widgets": {
- "aria-label-macros-value-selector": ""
+ "aria-label-macros-value-selector": "Makróérték-választó"
}
},
"utils": {
"get-columns-width-indices": {
- "label-selected-columns": ""
+ "label-selected-columns": "Kijelölt oszlopok"
}
}
}
diff --git a/packages/grafana-sql/src/locales/id-ID/grafana-sql.json b/packages/grafana-sql/src/locales/id-ID/grafana-sql.json
index e6c977bca22..e4344f3ee68 100644
--- a/packages/grafana-sql/src/locales/id-ID/grafana-sql.json
+++ b/packages/grafana-sql/src/locales/id-ID/grafana-sql.json
@@ -2,26 +2,26 @@
"grafana-sql": {
"components": {
"confirm-modal": {
- "builder-mode": "",
+ "builder-mode": "Mode pembuat tidak menampilkan perubahan yang dibuat dalam kode. Pembuat kueri akan menampilkan perubahan terakhir yang Anda buat dalam mode pembuat.",
"cancel": "Batalkan",
- "clipboard": "",
- "copy-code-and-switch": "",
- "discard-code-and-switch": "",
+ "clipboard": "Ingin menyalin kode Anda ke papan klip?",
+ "copy-code-and-switch": "Salin kode dan beralih",
+ "discard-code-and-switch": "Buang kode dan beralih",
"warning": "PERINGATAN"
},
"connection-limits": {
- "auto-max-idle": "",
- "content-auto-max-idle": "",
- "content-max-idle": "",
- "content-max-lifetime": "",
- "content-max-open": "",
- "max-idle": "",
- "max-lifetime": "",
- "max-open": "",
- "title-connection-limits": ""
+ "auto-max-idle": "Nonaktif maksimum otomatis",
+ "content-auto-max-idle": "Jika diaktifkan, secara otomatis atur jumlah <1>Koneksi nonaktif maksimum1> ke nilai yang sama dengan<3> Koneksi terbuka maksimum3>. Jika jumlah maksimum koneksi terbuka tidak diatur, jumlah tersebut akan diatur ke default ({{defaultMaxIdle}}).",
+ "content-max-idle": "Jumlah maksimum koneksi dalam pool koneksi nonaktif. Jika <1>Koneksi terbuka maksimum1> lebih besar dari 0 tetapi kurang dari <3>Koneksi nonaktif maksimum3>, maka <5>Koneksi nonaktif maksimum5> akan dikurangi agar sesuai dengan batas <8>Koneksi terbuka maksimum8>. Jika diatur ke 0, tidak ada koneksi nonaktif yang dipertahankan.",
+ "content-max-lifetime": "Jumlah waktu maksimum dalam detik untuk menggunakan koneksi lagi. Jika diatur ke 0, koneksi digunakan kembali terus-menerus tanpa batas waktu.",
+ "content-max-open": "Jumlah koneksi terbuka maksimum ke basis data. Jika <1>Koneksi nonaktif maksimum1> lebih besar dari 0 dan <3>Koneksi terbuka maksimum3> kurang dari <5>Koneksi nonaktif maksimum5>, maka <7>Koneksi nonaktif maksimum7> akan dikurangi agar sesuai dengan batas <9>Koneksi terbuka maksimum9>. Jika diatur ke 0, tidak ada batasan jumlah koneksi terbuka.",
+ "max-idle": "Nonaktif maks",
+ "max-lifetime": "Periode maks",
+ "max-open": "Terbuka maks",
+ "title-connection-limits": "Batas koneksi"
},
"dataset-selector": {
- "aria-label-dataset-selector": ""
+ "aria-label-dataset-selector": "Selektor kumpulan data"
},
"error-boundary": {
"fall-back": {
@@ -31,21 +31,21 @@
"get-custom-operators": {
"custom-operators": {
"label": {
- "macros": ""
+ "macros": "Makro"
}
}
},
"make-render-column": {
"render-column": {
"aria-label-group-by": "Kelompokkan berdasarkan",
- "title-remove-group-by-column": ""
+ "title-remove-group-by-column": "Hapus grup berdasarkan kolom"
}
},
"order-by-row": {
- "aria-label-order-by": "",
+ "aria-label-order-by": "Urutkan Berdasarkan",
"label-limit": "Batas",
- "label-offset": "",
- "label-order-by": ""
+ "label-offset": "Offset",
+ "label-order-by": "Urutkan Berdasarkan"
},
"preview": {
"label-element": {
@@ -54,100 +54,100 @@
}
},
"query-header": {
- "content-invalid-query": "",
+ "content-invalid-query": "Kueri Anda tidak valid. Periksa di bawah ini untuk detailnya. <1>1>Namun, Anda masih dapat menjalankan kueri ini.",
"editor-modes": {
"label-builder": "",
"label-code": ""
},
- "label-dataset": "",
+ "label-dataset": "Kumpulan data",
"label-filter": "Filter",
"label-format": "Format",
"label-group": "Grup",
- "label-order": "",
+ "label-order": "Pesanan",
"label-preview": "Pratinjau",
"label-table": "Tabel",
- "placeholder-select-format": "",
+ "placeholder-select-format": "Pilih format",
"run-query": "Jalankan kueri"
},
"query-toolbox": {
- "content-hit-ctrlcmdreturn-to-run-query": "",
- "tooltip-collapse": "",
- "tooltip-expand": "",
- "tooltip-format-query": ""
+ "content-hit-ctrlcmdreturn-to-run-query": "Tekan CTRL/CMD+Return untuk menjalankan kueri",
+ "tooltip-collapse": "Ciutkan editor",
+ "tooltip-expand": "Perluas editor",
+ "tooltip-format-query": "Format kueri"
},
"query-validator": {
- "query-will-process": "",
- "validating-query": ""
+ "query-will-process": "<0>0> Kueri ini akan memproses <2>{{bytes}}2> saat dijalankan.",
+ "validating-query": "Memvalidasi kueri..."
},
"raw-editor": {
"render-placeholder": {
- "editing-in-expanded-code-editor": ""
+ "editing-in-expanded-code-editor": "Mengedit di editor kode yang diperluas"
},
- "title-query-num": ""
+ "title-query-num": "Kueri {{queryNum}}"
},
"select-column": {
"label-column": "Kolom"
},
"select-custom-function-parameters": {
- "aria-label-parameter": "",
+ "aria-label-parameter": "Parameter {{index}} untuk kolom {{columnIndex}}",
"render-parameters": {
"params": {
- "title-remove-parameter": ""
+ "title-remove-parameter": "Hapus parameter"
}
},
- "title-add-parameter": ""
+ "title-add-parameter": "Tambahkan parameter"
},
"select-row": {
"aggregate-options": {
"options": {
"label": {
- "aggregations": "",
- "macros": ""
+ "aggregations": "Agregasi",
+ "macros": "Makro"
}
}
},
"label": {
- "time": "",
+ "time": "waktu",
"value": "nilai"
},
"label-alias": "Alias",
- "label-data-operations": "",
- "title-add-column": "",
- "title-remove-column": ""
+ "label-data-operations": "Operasi data",
+ "title-add-column": "Tambah kolom",
+ "title-remove-column": "Hapus kolom"
},
"settings": {
- "aria-label-conjunction": "",
+ "aria-label-conjunction": "Kata Penghubung",
"aria-label-field": "Bidang",
"aria-label-operator": "Operator",
- "title-button-filter": ""
+ "title-button-filter": "Filter {{ buttonLabel }}"
},
"sql-query-editor-lazy": {
"text-loading-editor": "Memuat editor"
},
"table-selector": {
- "aria-label-table-selector": "",
- "placeholder-loading": "",
- "placeholder-select-table": ""
+ "aria-label-table-selector": "Selektor tabel",
+ "placeholder-loading": "Memuat tabel",
+ "placeholder-select-table": "Pilih tabel"
},
"tlssecrets-config": {
- "content-tlsssl-client-certificate": "",
- "content-tlsssl-client-key": "",
- "content-tlsssl-root-certificate": "",
- "tlsssl-client-certificate": "",
- "tlsssl-client-key": "",
+ "content-tlsssl-client-certificate": "Untuk mengautentikasi dengan sertifikat klien TLS/SSL, berikan sertifikat klien di sini.",
+ "content-tlsssl-client-key": "Untuk mengautentikasi dengan sertifikat TLS/SSL klien, berikan kunci di sini.",
+ "content-tlsssl-root-certificate": "Jika mode TLS/SSL yang dipilih memerlukan sertifikat root server, berikan di sini",
+ "tlsssl-client-certificate": "Sertifikat Klien TLS/SSL",
+ "tlsssl-client-key": "Kunci Klien TLS",
"tlsssl-root-certificate": "Sertifikat Root TLS/SSL"
},
"visual-editor": {
- "label-filter-by-column-value": "",
- "label-group-by-column": ""
+ "label-filter-by-column-value": "Filter berdasarkan nilai kolom",
+ "label-group-by-column": "Kelompokkan berdasarkan kolom"
},
"widgets": {
- "aria-label-macros-value-selector": ""
+ "aria-label-macros-value-selector": "Selektor nilai makro"
}
},
"utils": {
"get-columns-width-indices": {
- "label-selected-columns": ""
+ "label-selected-columns": "Kolom yang dipilih"
}
}
}
diff --git a/packages/grafana-sql/src/locales/ja-JP/grafana-sql.json b/packages/grafana-sql/src/locales/ja-JP/grafana-sql.json
index 4340b874c6e..8c6668317e3 100644
--- a/packages/grafana-sql/src/locales/ja-JP/grafana-sql.json
+++ b/packages/grafana-sql/src/locales/ja-JP/grafana-sql.json
@@ -2,26 +2,26 @@
"grafana-sql": {
"components": {
"confirm-modal": {
- "builder-mode": "",
+ "builder-mode": "ビルダーモードではコードに加えられた変更は反映されません。クエリビルダーはビルダーモードで加えられた最後の変更を表示します。",
"cancel": "キャンセル",
- "clipboard": "",
- "copy-code-and-switch": "",
- "discard-code-and-switch": "",
+ "clipboard": "コードをクリップボードにコピーしますか?",
+ "copy-code-and-switch": "コードをコピーして切り替え",
+ "discard-code-and-switch": "コードを破棄して切り替え",
"warning": "警告"
},
"connection-limits": {
- "auto-max-idle": "",
- "content-auto-max-idle": "",
- "content-max-idle": "",
- "content-max-lifetime": "",
- "content-max-open": "",
- "max-idle": "",
- "max-lifetime": "",
- "max-open": "",
- "title-connection-limits": ""
+ "auto-max-idle": "自動最大アイドル",
+ "content-auto-max-idle": "有効にすると、<1>最大アイドル接続数1>が<3>最大オープン接続数3>と同じ値に自動設定されます。最大オープン接続数が設定されていない場合、デフォルト({{defaultMaxIdle}})に設定されます。",
+ "content-max-idle": "アイドル接続プールの最大接続数。<1>最大オープン接続数1>が0より大きく<3>最大アイドル接続数3>より小さい場合、<5>最大アイドル接続数5>は<8>最大オープン接続数8>の制限に合わせて削減されます。0に設定すると、アイドル接続は保持されません。",
+ "content-max-lifetime": "接続を再利用できる最大時間(秒)。0に設定すると、接続は永続的に再利用されます。",
+ "content-max-open": "データベースへの最大オープン接続数。<1>最大アイドル接続数1>が0より大きく<3>最大オープン接続数3>が<5>最大アイドル接続数5>より小さい場合、<7>最大アイドル接続数7>は<9>最大オープン接続数9>の制限に合わせて削減されます。0に設定すると、オープン接続数に制限はありません。",
+ "max-idle": "最大アイドル",
+ "max-lifetime": "最大有効期間",
+ "max-open": "最大オープン",
+ "title-connection-limits": "接続制限"
},
"dataset-selector": {
- "aria-label-dataset-selector": ""
+ "aria-label-dataset-selector": "データセットセレクター"
},
"error-boundary": {
"fall-back": {
@@ -31,21 +31,21 @@
"get-custom-operators": {
"custom-operators": {
"label": {
- "macros": ""
+ "macros": "マクロ"
}
}
},
"make-render-column": {
"render-column": {
"aria-label-group-by": "グループ化",
- "title-remove-group-by-column": ""
+ "title-remove-group-by-column": "グループ化列を削除"
}
},
"order-by-row": {
- "aria-label-order-by": "",
+ "aria-label-order-by": "並び順",
"label-limit": "制限",
- "label-offset": "",
- "label-order-by": ""
+ "label-offset": "オフセット",
+ "label-order-by": "並び順"
},
"preview": {
"label-element": {
@@ -54,100 +54,100 @@
}
},
"query-header": {
- "content-invalid-query": "",
+ "content-invalid-query": "クエリが無効です。詳細は下記をご確認ください。<1>1>ただし、このクエリは引き続き実行できます。",
"editor-modes": {
"label-builder": "",
"label-code": ""
},
- "label-dataset": "",
+ "label-dataset": "データセット",
"label-filter": "フィルタリング",
"label-format": "形式",
"label-group": "グループ",
- "label-order": "",
+ "label-order": "順番",
"label-preview": "プレビュー",
"label-table": "テーブル",
- "placeholder-select-format": "",
+ "placeholder-select-format": "フォーマットを選択",
"run-query": "クエリの実行"
},
"query-toolbox": {
- "content-hit-ctrlcmdreturn-to-run-query": "",
- "tooltip-collapse": "",
- "tooltip-expand": "",
- "tooltip-format-query": ""
+ "content-hit-ctrlcmdreturn-to-run-query": "CTRL/CMD+Returnでクエリを実行",
+ "tooltip-collapse": "エディターを折りたたむ",
+ "tooltip-expand": "エディターを展開",
+ "tooltip-format-query": "クエリをフォーマット"
},
"query-validator": {
- "query-will-process": "",
- "validating-query": ""
+ "query-will-process": "<0>0>このクエリは実行時に<2>{{bytes}}2>を処理します。",
+ "validating-query": "クエリを検証中..."
},
"raw-editor": {
"render-placeholder": {
- "editing-in-expanded-code-editor": ""
+ "editing-in-expanded-code-editor": "展開されたコードエディターで編集中"
},
- "title-query-num": ""
+ "title-query-num": "{{queryNum}}個のクエリ"
},
"select-column": {
"label-column": "列"
},
"select-custom-function-parameters": {
- "aria-label-parameter": "",
+ "aria-label-parameter": "列{{columnIndex}}のパラメーター{{index}}",
"render-parameters": {
"params": {
- "title-remove-parameter": ""
+ "title-remove-parameter": "パラメーターを削除"
}
},
- "title-add-parameter": ""
+ "title-add-parameter": "パラメーターを追加"
},
"select-row": {
"aggregate-options": {
"options": {
"label": {
- "aggregations": "",
- "macros": ""
+ "aggregations": "集計",
+ "macros": "マクロ"
}
}
},
"label": {
- "time": "",
+ "time": "時間",
"value": "値"
},
"label-alias": "エイリアス",
- "label-data-operations": "",
- "title-add-column": "",
- "title-remove-column": ""
+ "label-data-operations": "データ操作",
+ "title-add-column": "列を追加",
+ "title-remove-column": "列を削除"
},
"settings": {
- "aria-label-conjunction": "",
+ "aria-label-conjunction": "結合",
"aria-label-field": "フィールド",
"aria-label-operator": "オペレーター",
- "title-button-filter": ""
+ "title-button-filter": "{{ buttonLabel }}フィルター"
},
"sql-query-editor-lazy": {
"text-loading-editor": "エディタを読み込んでいます"
},
"table-selector": {
- "aria-label-table-selector": "",
- "placeholder-loading": "",
- "placeholder-select-table": ""
+ "aria-label-table-selector": "テーブルセレクター",
+ "placeholder-loading": "テーブルを読み込み中...",
+ "placeholder-select-table": "テーブルを選択"
},
"tlssecrets-config": {
- "content-tlsssl-client-certificate": "",
- "content-tlsssl-client-key": "",
- "content-tlsssl-root-certificate": "",
- "tlsssl-client-certificate": "",
- "tlsssl-client-key": "",
+ "content-tlsssl-client-certificate": "TLS/SSLクライアント証明書で認証するには、ここにクライアント証明書を入力します。",
+ "content-tlsssl-client-key": "クライアントTLS/SSL証明書で認証するには、ここにキーを入力します。",
+ "content-tlsssl-root-certificate": "選択したTLS/SSLモードでサーバールート証明書が必要な場合は、ここに入力します",
+ "tlsssl-client-certificate": "TLS/SSLクライアント証明書",
+ "tlsssl-client-key": "TLS/SSLクライアントキー",
"tlsssl-root-certificate": "TLS/SSLルート証明書"
},
"visual-editor": {
- "label-filter-by-column-value": "",
- "label-group-by-column": ""
+ "label-filter-by-column-value": "列の値でフィルタリング",
+ "label-group-by-column": "列でグループ化"
},
"widgets": {
- "aria-label-macros-value-selector": ""
+ "aria-label-macros-value-selector": "マクロ値セレクター"
}
},
"utils": {
"get-columns-width-indices": {
- "label-selected-columns": ""
+ "label-selected-columns": "選択された列"
}
}
}
diff --git a/packages/grafana-test-utils/package.json b/packages/grafana-test-utils/package.json
index 6df13ad831e..7f58c62ac0d 100644
--- a/packages/grafana-test-utils/package.json
+++ b/packages/grafana-test-utils/package.json
@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/test-utils",
- "version": "12.0.0-pre",
+ "version": "12.2.0-pre",
"private": true,
"description": "Grafana test utils & Mock API",
"keywords": [
@@ -50,7 +50,7 @@
},
"devDependencies": {
"@grafana/tsconfig": "^2.0.0",
- "@types/node": "22.15.0",
+ "@types/node": "22.16.5",
"typescript": "5.8.3"
}
}
diff --git a/packages/grafana-ui/.storybook/copyAssets.ts b/packages/grafana-ui/.storybook/copyAssets.ts
index e49cd32b5d0..198953b30e3 100644
--- a/packages/grafana-ui/.storybook/copyAssets.ts
+++ b/packages/grafana-ui/.storybook/copyAssets.ts
@@ -4,7 +4,7 @@
// when publishing new storybook.
// Note: Storybook has a static copying feature but it copies entire directories which can contain thousands of icons.
-import { copySync, emptyDirSync, lstatSync } from 'fs-extra';
+import { existsSync, copySync, lstatSync } from 'fs-extra';
import { resolve } from 'node:path';
// avoid importing from @grafana/data to prevent error: window is not defined
@@ -52,16 +52,13 @@ export function copyAssetsSync() {
},
];
- const staticDir = resolve(__dirname, 'static', 'public');
-
- emptyDirSync(staticDir);
-
for (const asset of assets) {
const fromPath = resolve(__dirname, asset.from);
const toPath = resolve(__dirname, asset.to);
-
- copySync(fromPath, toPath, {
- filter: (src) => !lstatSync(src).isSymbolicLink(),
- });
+ if (!existsSync(toPath)) {
+ copySync(fromPath, toPath, {
+ filter: (src) => !lstatSync(src).isSymbolicLink(),
+ });
+ }
}
}
diff --git a/packages/grafana-ui/.storybook/preview.ts b/packages/grafana-ui/.storybook/preview.ts
index 803d45315e3..39542016eab 100644
--- a/packages/grafana-ui/.storybook/preview.ts
+++ b/packages/grafana-ui/.storybook/preview.ts
@@ -64,6 +64,7 @@ const preview: Preview = {
docs: {
container: ThemedDocsContainer,
},
+ a11y: { test: 'error' },
knobs: {
disable: true,
},
diff --git a/packages/grafana-ui/package.json b/packages/grafana-ui/package.json
index 61f0d9a0d15..553dd3b8fa7 100644
--- a/packages/grafana-ui/package.json
+++ b/packages/grafana-ui/package.json
@@ -2,7 +2,7 @@
"author": "Grafana Labs",
"license": "Apache-2.0",
"name": "@grafana/ui",
- "version": "12.1.0-pre",
+ "version": "12.2.0-pre",
"description": "Grafana Components Library",
"keywords": [
"grafana",
@@ -53,6 +53,7 @@
"clean": "rimraf ./dist ./compiled ./unstable ./package.tgz",
"storybook": "storybook dev -p 9001 -c .storybook --no-open",
"storybook:build": "storybook build -o ./dist/storybook -c .storybook",
+ "storybook:test": "test-storybook --url http://localhost:9001",
"typecheck": "tsc --emitDeclarationOnly false --noEmit",
"prepack": "cp package.json package.json.bak && ALIAS_PACKAGE_NAME=unstable node ../../scripts/prepare-npm-package.js",
"postpack": "mv package.json.bak package.json && rimraf ./unstable"
@@ -65,12 +66,12 @@
"@emotion/css": "11.13.5",
"@emotion/react": "11.14.0",
"@emotion/serialize": "1.3.3",
- "@floating-ui/react": "0.27.13",
- "@grafana/data": "12.1.0-pre",
- "@grafana/e2e-selectors": "12.1.0-pre",
+ "@floating-ui/react": "0.27.14",
+ "@grafana/data": "12.2.0-pre",
+ "@grafana/e2e-selectors": "12.2.0-pre",
"@grafana/faro-web-sdk": "^1.13.2",
- "@grafana/i18n": "12.1.0-pre",
- "@grafana/schema": "12.1.0-pre",
+ "@grafana/i18n": "12.2.0-pre",
+ "@grafana/schema": "12.2.0-pre",
"@hello-pangea/dnd": "18.0.1",
"@monaco-editor/react": "4.7.0",
"@popperjs/core": "2.11.8",
@@ -98,7 +99,7 @@
"micro-memoize": "^4.1.2",
"moment": "2.30.1",
"monaco-editor": "0.34.1",
- "ol": "10.6.0",
+ "ol": "10.6.1",
"prismjs": "1.30.0",
"rc-cascader": "3.34.0",
"rc-drawer": "7.3.0",
@@ -133,7 +134,7 @@
"uwrap": "0.1.1"
},
"devDependencies": {
- "@babel/core": "7.26.10",
+ "@babel/core": "7.28.0",
"@faker-js/faker": "^9.0.0",
"@grafana/tsconfig": "^2.0.0",
"@rollup/plugin-node-resolve": "16.0.1",
@@ -152,19 +153,20 @@
"@storybook/preview-api": "^8.6.2",
"@storybook/react": "^8.6.2",
"@storybook/react-webpack5": "^8.6.2",
+ "@storybook/test-runner": "^0.23.0",
"@storybook/theming": "^8.6.2",
"@testing-library/dom": "10.4.0",
"@testing-library/jest-dom": "6.6.3",
- "@testing-library/react": "16.2.0",
+ "@testing-library/react": "16.3.0",
"@testing-library/user-event": "14.6.1",
"@types/chance": "^1.1.7",
"@types/common-tags": "^1.8.0",
"@types/d3": "7.4.3",
- "@types/hoist-non-react-statics": "3.3.6",
+ "@types/hoist-non-react-statics": "3.3.7",
"@types/is-hotkey": "0.1.10",
"@types/jest": "29.5.14",
"@types/mock-raf": "1.0.6",
- "@types/node": "22.15.0",
+ "@types/node": "22.16.5",
"@types/prismjs": "1.26.5",
"@types/react": "18.3.18",
"@types/react-color": "3.0.13",
@@ -179,10 +181,10 @@
"@types/uuid": "10.0.0",
"chance": "^1.1.13",
"common-tags": "1.8.2",
- "core-js": "3.40.0",
+ "core-js": "3.44.0",
"css-loader": "7.1.2",
"csstype": "3.1.3",
- "esbuild": "0.25.6",
+ "esbuild": "0.25.8",
"expose-loader": "5.0.1",
"fs-extra": "^11.2.0",
"mock-raf": "1.0.1",
@@ -195,10 +197,10 @@
"rimraf": "6.0.1",
"rollup": "^4.22.4",
"rollup-plugin-copy": "3.5.0",
- "rollup-plugin-esbuild": "6.2.0",
+ "rollup-plugin-esbuild": "6.2.1",
"rollup-plugin-node-externals": "^8.0.0",
"rollup-plugin-svg-import": "3.0.0",
- "sass-loader": "16.0.4",
+ "sass-loader": "16.0.5",
"storybook": "^8.6.2",
"style-loader": "4.0.0",
"typescript": "5.8.3",
diff --git a/packages/grafana-ui/rollup.config.ts b/packages/grafana-ui/rollup.config.ts
index bf652c8d21f..16c81ca4af8 100644
--- a/packages/grafana-ui/rollup.config.ts
+++ b/packages/grafana-ui/rollup.config.ts
@@ -25,6 +25,7 @@ export default [
}),
],
output: [cjsOutput(pkg), esmOutput(pkg, 'grafana-ui')],
+ treeshake: false,
},
{
input: 'src/unstable.ts',
@@ -37,5 +38,6 @@ export default [
}),
],
output: [cjsOutput(pkg), esmOutput(pkg, 'grafana-ui')],
+ treeshake: false,
},
];
diff --git a/packages/grafana-ui/src/components/AutoSaveField/AutoSaveField.story.tsx b/packages/grafana-ui/src/components/AutoSaveField/AutoSaveField.story.tsx
index eb6cb427eba..24df1318d55 100644
--- a/packages/grafana-ui/src/components/AutoSaveField/AutoSaveField.story.tsx
+++ b/packages/grafana-ui/src/components/AutoSaveField/AutoSaveField.story.tsx
@@ -35,6 +35,8 @@ const meta: Meta = {
'validationMessageHorizontalOverflow',
],
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
argTypes: {
saveErrorMessage: { control: 'text' },
diff --git a/packages/grafana-ui/src/components/Button/Button.story.tsx b/packages/grafana-ui/src/components/Button/Button.story.tsx
index 5f26875852e..91746e38dc1 100644
--- a/packages/grafana-ui/src/components/Button/Button.story.tsx
+++ b/packages/grafana-ui/src/components/Button/Button.story.tsx
@@ -18,6 +18,8 @@ export default {
docs: {
page: mdx,
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
argTypes: {
size: {
diff --git a/packages/grafana-ui/src/components/Carousel/Carousel.story.tsx b/packages/grafana-ui/src/components/Carousel/Carousel.story.tsx
index 33a2c762582..68385877df8 100644
--- a/packages/grafana-ui/src/components/Carousel/Carousel.story.tsx
+++ b/packages/grafana-ui/src/components/Carousel/Carousel.story.tsx
@@ -19,6 +19,8 @@ const meta: Meta = {
component: Carousel,
parameters: {
docs: { page: mdx },
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
argTypes: {
images: {
diff --git a/packages/grafana-ui/src/components/Cascader/Cascader.story.tsx b/packages/grafana-ui/src/components/Cascader/Cascader.story.tsx
index 761235d5a22..789b4d04211 100644
--- a/packages/grafana-ui/src/components/Cascader/Cascader.story.tsx
+++ b/packages/grafana-ui/src/components/Cascader/Cascader.story.tsx
@@ -49,6 +49,8 @@ const meta: Meta = {
'formatCreateLabel',
],
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
args: {
onSelect,
diff --git a/packages/grafana-ui/src/components/ColorPicker/ColorPicker.story.tsx b/packages/grafana-ui/src/components/ColorPicker/ColorPicker.story.tsx
index c3967136503..5b3f6921084 100644
--- a/packages/grafana-ui/src/components/ColorPicker/ColorPicker.story.tsx
+++ b/packages/grafana-ui/src/components/ColorPicker/ColorPicker.story.tsx
@@ -18,6 +18,8 @@ const meta: Meta = {
controls: {
exclude: ['onChange', 'onColorChange'],
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
args: {
enableNamedColors: false,
diff --git a/packages/grafana-ui/src/components/ColorPicker/ColorPickerInput.story.tsx b/packages/grafana-ui/src/components/ColorPicker/ColorPickerInput.story.tsx
index 0be0684ca33..b0f637b7d7d 100644
--- a/packages/grafana-ui/src/components/ColorPicker/ColorPickerInput.story.tsx
+++ b/packages/grafana-ui/src/components/ColorPicker/ColorPickerInput.story.tsx
@@ -11,6 +11,8 @@ const meta: Meta = {
controls: {
exclude: ['onChange', 'onColorChange'],
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
};
diff --git a/packages/grafana-ui/src/components/Combobox/MultiCombobox.story.tsx b/packages/grafana-ui/src/components/Combobox/MultiCombobox.story.tsx
index 9456242aa8f..fd015178845 100644
--- a/packages/grafana-ui/src/components/Combobox/MultiCombobox.story.tsx
+++ b/packages/grafana-ui/src/components/Combobox/MultiCombobox.story.tsx
@@ -17,6 +17,8 @@ const meta: Meta = {
docs: {
page: mdx,
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
};
diff --git a/packages/grafana-ui/src/components/ConfirmButton/ConfirmButton.story.tsx b/packages/grafana-ui/src/components/ConfirmButton/ConfirmButton.story.tsx
index 106dfc19af6..371e431185b 100644
--- a/packages/grafana-ui/src/components/ConfirmButton/ConfirmButton.story.tsx
+++ b/packages/grafana-ui/src/components/ConfirmButton/ConfirmButton.story.tsx
@@ -21,6 +21,8 @@ const meta: Meta = {
controls: {
exclude: ['className', 'onClick', 'onCancel', 'onConfirm'],
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
args: {
buttonText: 'Edit',
diff --git a/packages/grafana-ui/src/components/ContextMenu/ContextMenu.story.tsx b/packages/grafana-ui/src/components/ContextMenu/ContextMenu.story.tsx
index ebafcf95e03..78587ebb1dd 100644
--- a/packages/grafana-ui/src/components/ContextMenu/ContextMenu.story.tsx
+++ b/packages/grafana-ui/src/components/ContextMenu/ContextMenu.story.tsx
@@ -19,6 +19,8 @@ const meta: Meta = {
controls: {
exclude: ['renderMenuItems', 'renderHeader', 'onClose', 'children'],
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
args: {
x: 200,
diff --git a/packages/grafana-ui/src/components/DateTimePickers/RelativeTimeRangePicker/RelativeTimeRangePicker.tsx b/packages/grafana-ui/src/components/DateTimePickers/RelativeTimeRangePicker/RelativeTimeRangePicker.tsx
index 7e49593d860..f75c4f1f2c8 100644
--- a/packages/grafana-ui/src/components/DateTimePickers/RelativeTimeRangePicker/RelativeTimeRangePicker.tsx
+++ b/packages/grafana-ui/src/components/DateTimePickers/RelativeTimeRangePicker/RelativeTimeRangePicker.tsx
@@ -16,7 +16,7 @@ import { getInputStyles, Input } from '../../Input/Input';
import { ScrollContainer } from '../../ScrollContainer/ScrollContainer';
import { TimePickerTitle } from '../TimeRangePicker/TimePickerTitle';
import { TimeRangeList } from '../TimeRangePicker/TimeRangeList';
-import { quickOptions } from '../options';
+import { getQuickOptions } from '../options';
import {
isRangeValid,
@@ -39,8 +39,6 @@ type InputState = {
validation: RangeValidation;
};
-const validOptions = quickOptions.filter((o) => isRelativeFormat(o.from));
-
/**
* @internal
*/
@@ -57,6 +55,7 @@ export function RelativeTimeRangePicker(props: RelativeTimeRangePickerProps) {
ref
);
const { dialogProps } = useDialog({}, ref);
+ const validOptions = getQuickOptions().filter((o) => isRelativeFormat(o.from));
// the order of middleware is important!
// see https://floating-ui.com/docs/arrow#order
diff --git a/packages/grafana-ui/src/components/DateTimePickers/TimeOfDayPicker.story.tsx b/packages/grafana-ui/src/components/DateTimePickers/TimeOfDayPicker.story.tsx
index d3678e8dc84..baea8271f34 100644
--- a/packages/grafana-ui/src/components/DateTimePickers/TimeOfDayPicker.story.tsx
+++ b/packages/grafana-ui/src/components/DateTimePickers/TimeOfDayPicker.story.tsx
@@ -13,6 +13,8 @@ const meta: Meta = {
controls: {
exclude: ['onChange'],
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
args: {
value: dateTime(Date.now()),
diff --git a/packages/grafana-ui/src/components/DateTimePickers/TimeRangeInput.tsx b/packages/grafana-ui/src/components/DateTimePickers/TimeRangeInput.tsx
index 7ef005c42c6..67d3af9496a 100644
--- a/packages/grafana-ui/src/components/DateTimePickers/TimeRangeInput.tsx
+++ b/packages/grafana-ui/src/components/DateTimePickers/TimeRangeInput.tsx
@@ -13,7 +13,7 @@ import { getInputStyles } from '../Input/Input';
import { TimePickerContent } from './TimeRangePicker/TimePickerContent';
import { TimeRangeLabel } from './TimeRangePicker/TimeRangeLabel';
import { WeekStart } from './WeekStartPicker';
-import { quickOptions } from './options';
+import { getQuickOptions } from './options';
import { isValidTimeRange } from './utils';
export interface TimeRangeInputProps {
@@ -123,7 +123,7 @@ export const TimeRangeInput = ({
timeZone={timeZone}
value={isValidTimeRange(value) ? value : getDefaultTimeRange()}
onChange={onRangeChange}
- quickOptions={quickOptions}
+ quickOptions={getQuickOptions()}
onChangeTimeZone={onChangeTimeZone}
className={styles.content}
hideTimeZone={hideTimeZone}
diff --git a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker.tsx b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker.tsx
index 3888b76f6c4..926fcce5615 100644
--- a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker.tsx
+++ b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker.tsx
@@ -28,7 +28,7 @@ import { Tooltip } from '../Tooltip/Tooltip';
import { TimePickerContent } from './TimeRangePicker/TimePickerContent';
import { TimeZoneDescription } from './TimeZonePicker/TimeZoneDescription';
import { WeekStart } from './WeekStartPicker';
-import { quickOptions } from './options';
+import { getQuickOptions } from './options';
import { useTimeSync } from './utils/useTimeSync';
/** @public */
@@ -189,7 +189,7 @@ export function TimeRangePicker(props: TimeRangePickerProps) {
fiscalYearStartMonth={fiscalYearStartMonth}
value={value}
onChange={onChange}
- quickOptions={quickRanges || quickOptions}
+ quickOptions={quickRanges || getQuickOptions()}
history={history}
showHistory
widthOverride={widthOverride}
diff --git a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerFooter.tsx b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerFooter.tsx
index 69fe98c09d5..c59806cea13 100644
--- a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerFooter.tsx
+++ b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerFooter.tsx
@@ -18,7 +18,7 @@ import { TimeZonePicker } from '../TimeZonePicker';
import { TimeZoneDescription } from '../TimeZonePicker/TimeZoneDescription';
import { TimeZoneOffset } from '../TimeZonePicker/TimeZoneOffset';
import { TimeZoneTitle } from '../TimeZonePicker/TimeZoneTitle';
-import { monthOptions } from '../options';
+import { getMonthOptions } from '../options';
interface Props {
timeZone?: TimeZone;
@@ -146,7 +146,7 @@ export const TimePickerFooter = (props: Props) => {
>
{
if (onChangeFiscalYearStartMonth) {
onChangeFiscalYearStartMonth(value?.value ?? 0);
diff --git a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/mapper.ts b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/mapper.ts
index cce0bb76e37..160a1bdbc96 100644
--- a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/mapper.ts
+++ b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/mapper.ts
@@ -7,6 +7,7 @@ export const mapOptionToTimeRange = (option: TimeOption, timeZone?: TimeZone): T
return rangeUtil.convertRawToRange({ from: option.from, to: option.to }, timeZone, undefined, commonFormat);
};
+// TODO: Should we keep these format presets somewhere common?
const rangeFormatShort: Intl.DateTimeFormatOptions = {
dateStyle: 'short',
timeStyle: 'short',
diff --git a/packages/grafana-ui/src/components/DateTimePickers/options.ts b/packages/grafana-ui/src/components/DateTimePickers/options.ts
index 8f64046cf41..5ef8ef5ab5a 100644
--- a/packages/grafana-ui/src/components/DateTimePickers/options.ts
+++ b/packages/grafana-ui/src/components/DateTimePickers/options.ts
@@ -1,57 +1,134 @@
import { TimeOption } from '@grafana/data';
+import { t } from '@grafana/i18n';
import { ComboboxOption } from '../Combobox/types';
-export const quickOptions: TimeOption[] = [
- { from: 'now-5m', to: 'now', display: 'Last 5 minutes' },
- { from: 'now-15m', to: 'now', display: 'Last 15 minutes' },
- { from: 'now-30m', to: 'now', display: 'Last 30 minutes' },
- { from: 'now-1h', to: 'now', display: 'Last 1 hour' },
- { from: 'now-3h', to: 'now', display: 'Last 3 hours' },
- { from: 'now-6h', to: 'now', display: 'Last 6 hours' },
- { from: 'now-12h', to: 'now', display: 'Last 12 hours' },
- { from: 'now-24h', to: 'now', display: 'Last 24 hours' },
- { from: 'now-2d', to: 'now', display: 'Last 2 days' },
- { from: 'now-7d', to: 'now', display: 'Last 7 days' },
- { from: 'now-30d', to: 'now', display: 'Last 30 days' },
- { from: 'now-90d', to: 'now', display: 'Last 90 days' },
- { from: 'now-6M', to: 'now', display: 'Last 6 months' },
- { from: 'now-1y', to: 'now', display: 'Last 1 year' },
- { from: 'now-2y', to: 'now', display: 'Last 2 years' },
- { from: 'now-5y', to: 'now', display: 'Last 5 years' },
- { from: 'now-1d/d', to: 'now-1d/d', display: 'Yesterday' },
- { from: 'now-2d/d', to: 'now-2d/d', display: 'Day before yesterday' },
- { from: 'now-7d/d', to: 'now-7d/d', display: 'This day last week' },
- { from: 'now-1w/w', to: 'now-1w/w', display: 'Previous week' },
- { from: 'now-1M/M', to: 'now-1M/M', display: 'Previous month' },
- { from: 'now-1Q/fQ', to: 'now-1Q/fQ', display: 'Previous fiscal quarter' },
- { from: 'now-1y/y', to: 'now-1y/y', display: 'Previous year' },
- { from: 'now-1y/fy', to: 'now-1y/fy', display: 'Previous fiscal year' },
- { from: 'now/d', to: 'now/d', display: 'Today' },
- { from: 'now/d', to: 'now', display: 'Today so far' },
- { from: 'now/w', to: 'now/w', display: 'This week' },
- { from: 'now/w', to: 'now', display: 'This week so far' },
- { from: 'now/M', to: 'now/M', display: 'This month' },
- { from: 'now/M', to: 'now', display: 'This month so far' },
- { from: 'now/y', to: 'now/y', display: 'This year' },
- { from: 'now/y', to: 'now', display: 'This year so far' },
- { from: 'now/fQ', to: 'now', display: 'This fiscal quarter so far' },
- { from: 'now/fQ', to: 'now/fQ', display: 'This fiscal quarter' },
- { from: 'now/fy', to: 'now', display: 'This fiscal year so far' },
- { from: 'now/fy', to: 'now/fy', display: 'This fiscal year' },
+export const getQuickOptions: () => TimeOption[] = () => [
+ { from: 'now-5m', to: 'now', display: t('grafana-ui.date-time-pickers.quick-options.last-5-mins', 'Last 5 minutes') },
+ {
+ from: 'now-15m',
+ to: 'now',
+ display: t('grafana-ui.date-time-pickers.quick-options.last-15-mins', 'Last 15 minutes'),
+ },
+ {
+ from: 'now-30m',
+ to: 'now',
+ display: t('grafana-ui.date-time-pickers.quick-options.last-30-mins', 'Last 30 minutes'),
+ },
+ { from: 'now-1h', to: 'now', display: t('grafana-ui.date-time-pickers.quick-options.last-1-hour', 'Last 1 hour') },
+ { from: 'now-3h', to: 'now', display: t('grafana-ui.date-time-pickers.quick-options.last-3-hours', 'Last 3 hours') },
+ { from: 'now-6h', to: 'now', display: t('grafana-ui.date-time-pickers.quick-options.last-6-hours', 'Last 6 hours') },
+ {
+ from: 'now-12h',
+ to: 'now',
+ display: t('grafana-ui.date-time-pickers.quick-options.last-12-hours', 'Last 12 hours'),
+ },
+ {
+ from: 'now-24h',
+ to: 'now',
+ display: t('grafana-ui.date-time-pickers.quick-options.last-24-hours', 'Last 24 hours'),
+ },
+ { from: 'now-2d', to: 'now', display: t('grafana-ui.date-time-pickers.quick-options.last-2-days', 'Last 2 days') },
+ { from: 'now-7d', to: 'now', display: t('grafana-ui.date-time-pickers.quick-options.last-7-days', 'Last 7 days') },
+ { from: 'now-30d', to: 'now', display: t('grafana-ui.date-time-pickers.quick-options.last-30-days', 'Last 30 days') },
+ { from: 'now-90d', to: 'now', display: t('grafana-ui.date-time-pickers.quick-options.last-90-days', 'Last 90 days') },
+ {
+ from: 'now-6M',
+ to: 'now',
+ display: t('grafana-ui.date-time-pickers.quick-options.last-6-months', 'Last 6 months'),
+ },
+ { from: 'now-1y', to: 'now', display: t('grafana-ui.date-time-pickers.quick-options.last-1-year', 'Last 1 year') },
+ { from: 'now-2y', to: 'now', display: t('grafana-ui.date-time-pickers.quick-options.last-2-years', 'Last 2 years') },
+ { from: 'now-5y', to: 'now', display: t('grafana-ui.date-time-pickers.quick-options.last-5-years', 'Last 5 years') },
+ { from: 'now-1d/d', to: 'now-1d/d', display: t('grafana-ui.date-time-pickers.quick-options.yesterday', 'Yesterday') },
+ {
+ from: 'now-2d/d',
+ to: 'now-2d/d',
+ display: t('grafana-ui.date-time-pickers.quick-options.day-before-yesterday', 'Day before yesterday'),
+ },
+ {
+ from: 'now-7d/d',
+ to: 'now-7d/d',
+ display: t('grafana-ui.date-time-pickers.quick-options.this-day-last-week', 'This day last week'),
+ },
+ {
+ from: 'now-1w/w',
+ to: 'now-1w/w',
+ display: t('grafana-ui.date-time-pickers.quick-options.previous-week', 'Previous week'),
+ },
+ {
+ from: 'now-1M/M',
+ to: 'now-1M/M',
+ display: t('grafana-ui.date-time-pickers.quick-options.previous-month', 'Previous month'),
+ },
+ {
+ from: 'now-1Q/fQ',
+ to: 'now-1Q/fQ',
+ display: t('grafana-ui.date-time-pickers.quick-options.previous-fiscal-quarter', 'Previous fiscal quarter'),
+ },
+ {
+ from: 'now-1y/y',
+ to: 'now-1y/y',
+ display: t('grafana-ui.date-time-pickers.quick-options.previous-year', 'Previous year'),
+ },
+ {
+ from: 'now-1y/fy',
+ to: 'now-1y/fy',
+ display: t('grafana-ui.date-time-pickers.quick-options.previous-fiscal-year', 'Previous fiscal year'),
+ },
+ { from: 'now/d', to: 'now/d', display: t('grafana-ui.date-time-pickers.quick-options.today', 'Today') },
+ { from: 'now/d', to: 'now', display: t('grafana-ui.date-time-pickers.quick-options.today-so-far', 'Today so far') },
+ { from: 'now/w', to: 'now/w', display: t('grafana-ui.date-time-pickers.quick-options.this-week', 'This week') },
+ {
+ from: 'now/w',
+ to: 'now',
+ display: t('grafana-ui.date-time-pickers.quick-options.this-week-so-far', 'This week so far'),
+ },
+ { from: 'now/M', to: 'now/M', display: t('grafana-ui.date-time-pickers.quick-options.this-month', 'This month') },
+ {
+ from: 'now/M',
+ to: 'now',
+ display: t('grafana-ui.date-time-pickers.quick-options.this-month-so-far', 'This month so far'),
+ },
+ { from: 'now/y', to: 'now/y', display: t('grafana-ui.date-time-pickers.quick-options.this-year', 'This year') },
+ {
+ from: 'now/y',
+ to: 'now',
+ display: t('grafana-ui.date-time-pickers.quick-options.this-year-so-far', 'This year so far'),
+ },
+ {
+ from: 'now/fQ',
+ to: 'now',
+ display: t('grafana-ui.date-time-pickers.quick-options.this-fiscal-quarter-so-far', 'This fiscal quarter so far'),
+ },
+ {
+ from: 'now/fQ',
+ to: 'now/fQ',
+ display: t('grafana-ui.date-time-pickers.quick-options.this-fiscal-quarter', 'This fiscal quarter'),
+ },
+ {
+ from: 'now/fy',
+ to: 'now',
+ display: t('grafana-ui.date-time-pickers.quick-options.this-fiscal-year-so-far', 'This fiscal year so far'),
+ },
+ {
+ from: 'now/fy',
+ to: 'now/fy',
+ display: t('grafana-ui.date-time-pickers.quick-options.this-fiscal-year', 'This fiscal year'),
+ },
];
-export const monthOptions: Array> = [
- { label: 'January', value: 0 },
- { label: 'February', value: 1 },
- { label: 'March', value: 2 },
- { label: 'April', value: 3 },
- { label: 'May', value: 4 },
- { label: 'June', value: 5 },
- { label: 'July', value: 6 },
- { label: 'August', value: 7 },
- { label: 'September', value: 8 },
- { label: 'October', value: 9 },
- { label: 'November', value: 10 },
- { label: 'December', value: 11 },
+export const getMonthOptions: () => Array> = () => [
+ { label: t('grafana-ui.date-time-pickers.month-options.label-january', 'January'), value: 0 },
+ { label: t('grafana-ui.date-time-pickers.month-options.label-february', 'February'), value: 1 },
+ { label: t('grafana-ui.date-time-pickers.month-options.label-march', 'March'), value: 2 },
+ { label: t('grafana-ui.date-time-pickers.month-options.label-april', 'April'), value: 3 },
+ { label: t('grafana-ui.date-time-pickers.month-options.label-may', 'May'), value: 4 },
+ { label: t('grafana-ui.date-time-pickers.month-options.label-june', 'June'), value: 5 },
+ { label: t('grafana-ui.date-time-pickers.month-options.label-july', 'July'), value: 6 },
+ { label: t('grafana-ui.date-time-pickers.month-options.label-august', 'August'), value: 7 },
+ { label: t('grafana-ui.date-time-pickers.month-options.label-september', 'September'), value: 8 },
+ { label: t('grafana-ui.date-time-pickers.month-options.label-october', 'October'), value: 9 },
+ { label: t('grafana-ui.date-time-pickers.month-options.label-november', 'November'), value: 10 },
+ { label: t('grafana-ui.date-time-pickers.month-options.label-december', 'December'), value: 11 },
];
diff --git a/packages/grafana-ui/src/components/FileDropzone/FileDropzone.story.tsx b/packages/grafana-ui/src/components/FileDropzone/FileDropzone.story.tsx
index ac9b70eb14c..9ac5e775590 100644
--- a/packages/grafana-ui/src/components/FileDropzone/FileDropzone.story.tsx
+++ b/packages/grafana-ui/src/components/FileDropzone/FileDropzone.story.tsx
@@ -10,6 +10,8 @@ const meta: Meta = {
docs: {
page: mdx,
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
};
diff --git a/packages/grafana-ui/src/components/FormField/FormField.story.tsx b/packages/grafana-ui/src/components/FormField/FormField.story.tsx
index 845001dcacc..9d39b20536b 100644
--- a/packages/grafana-ui/src/components/FormField/FormField.story.tsx
+++ b/packages/grafana-ui/src/components/FormField/FormField.story.tsx
@@ -9,6 +9,8 @@ const meta: Meta = {
controls: {
exclude: ['inputEl'],
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
args: {
inputWidth: 20,
diff --git a/packages/grafana-ui/src/components/Forms/Checkbox.story.tsx b/packages/grafana-ui/src/components/Forms/Checkbox.story.tsx
index fa4d1fb1d8e..f79388911bd 100644
--- a/packages/grafana-ui/src/components/Forms/Checkbox.story.tsx
+++ b/packages/grafana-ui/src/components/Forms/Checkbox.story.tsx
@@ -18,6 +18,8 @@ const meta: Meta = {
controls: {
exclude: ['value', 'htmlValue'],
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
};
diff --git a/packages/grafana-ui/src/components/Forms/Field.story.tsx b/packages/grafana-ui/src/components/Forms/Field.story.tsx
index b3accd1e492..e4ed14c79d6 100644
--- a/packages/grafana-ui/src/components/Forms/Field.story.tsx
+++ b/packages/grafana-ui/src/components/Forms/Field.story.tsx
@@ -26,6 +26,8 @@ const meta: Meta = {
controls: {
exclude: ['children', 'className'],
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
};
diff --git a/packages/grafana-ui/src/components/Forms/FieldArray.story.tsx b/packages/grafana-ui/src/components/Forms/FieldArray.story.tsx
index fa38cf6521e..69179f5c0a2 100644
--- a/packages/grafana-ui/src/components/Forms/FieldArray.story.tsx
+++ b/packages/grafana-ui/src/components/Forms/FieldArray.story.tsx
@@ -21,6 +21,8 @@ const meta: Meta = {
controls: {
exclude: ['name', 'keyName', 'control', 'shouldUnregister'],
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
argTypes: {
containerWidth: { control: { type: 'range', min: 100, max: 500, step: 10 } },
diff --git a/packages/grafana-ui/src/components/Forms/FieldSet.story.tsx b/packages/grafana-ui/src/components/Forms/FieldSet.story.tsx
index 96e66a07290..6d9037aa852 100644
--- a/packages/grafana-ui/src/components/Forms/FieldSet.story.tsx
+++ b/packages/grafana-ui/src/components/Forms/FieldSet.story.tsx
@@ -21,6 +21,8 @@ const meta: Meta = {
controls: {
exclude: ['children'],
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
argTypes: {
label: { control: 'text' },
diff --git a/packages/grafana-ui/src/components/Forms/Form.story.tsx b/packages/grafana-ui/src/components/Forms/Form.story.tsx
index 7c12beb7465..1ef5d4de60f 100644
--- a/packages/grafana-ui/src/components/Forms/Form.story.tsx
+++ b/packages/grafana-ui/src/components/Forms/Form.story.tsx
@@ -23,6 +23,8 @@ export default {
docs: {
page: mdx,
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
};
diff --git a/packages/grafana-ui/src/components/Forms/InlineField.story.tsx b/packages/grafana-ui/src/components/Forms/InlineField.story.tsx
index da42f012f3a..9ecff0b22e7 100644
--- a/packages/grafana-ui/src/components/Forms/InlineField.story.tsx
+++ b/packages/grafana-ui/src/components/Forms/InlineField.story.tsx
@@ -23,6 +23,8 @@ const meta: Meta = {
controls: {
exclude: ['htmlFor', 'className', 'children'],
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
};
diff --git a/packages/grafana-ui/src/components/Forms/RadioButtonGroup/RadioButtonGroup.story.tsx b/packages/grafana-ui/src/components/Forms/RadioButtonGroup/RadioButtonGroup.story.tsx
index 4fe04474b16..8f8dadc33f0 100644
--- a/packages/grafana-ui/src/components/Forms/RadioButtonGroup/RadioButtonGroup.story.tsx
+++ b/packages/grafana-ui/src/components/Forms/RadioButtonGroup/RadioButtonGroup.story.tsx
@@ -14,6 +14,8 @@ const meta: Meta = {
controls: {
exclude: ['className', 'options', 'value', 'onChange', 'onClick', 'id'],
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
argTypes: {
disabledOptions: {
diff --git a/packages/grafana-ui/src/components/InlineToast/InlineToast.story.tsx b/packages/grafana-ui/src/components/InlineToast/InlineToast.story.tsx
index 3173eb4751d..a232b737aed 100644
--- a/packages/grafana-ui/src/components/InlineToast/InlineToast.story.tsx
+++ b/packages/grafana-ui/src/components/InlineToast/InlineToast.story.tsx
@@ -14,6 +14,8 @@ const story: Meta = {
docs: {
page: mdx,
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
argTypes: {
referenceElement: {
diff --git a/packages/grafana-ui/src/components/Input/Input.story.tsx b/packages/grafana-ui/src/components/Input/Input.story.tsx
index eab7f1d3ddc..20da7ce5aac 100644
--- a/packages/grafana-ui/src/components/Input/Input.story.tsx
+++ b/packages/grafana-ui/src/components/Input/Input.story.tsx
@@ -31,6 +31,8 @@ const meta: Meta = {
controls: {
exclude: ['prefix', 'suffix', 'addonBefore', 'addonAfter'],
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
args: {
type: 'text',
diff --git a/packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.story.tsx b/packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.story.tsx
index e0df9d9782f..c8cf16cf2b6 100644
--- a/packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.story.tsx
+++ b/packages/grafana-ui/src/components/InteractiveTable/InteractiveTable.story.tsx
@@ -112,6 +112,8 @@ const meta: Meta> = {
controls: {
exclude: EXCLUDED_PROPS,
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
args: {
columns: [
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 eee4984019c..f7ec6fcfbf5 100644
--- a/packages/grafana-ui/src/components/Layout/Grid/Grid.story.tsx
+++ b/packages/grafana-ui/src/components/Layout/Grid/Grid.story.tsx
@@ -17,6 +17,8 @@ const meta: Meta = {
docs: {
page: mdx,
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
args: {
gap: 1,
diff --git a/packages/grafana-ui/src/components/Layout/Stack/Stack.story.tsx b/packages/grafana-ui/src/components/Layout/Stack/Stack.story.tsx
index 5acad6ab10f..14e4e3b5124 100644
--- a/packages/grafana-ui/src/components/Layout/Stack/Stack.story.tsx
+++ b/packages/grafana-ui/src/components/Layout/Stack/Stack.story.tsx
@@ -16,6 +16,8 @@ const meta: Meta = {
docs: {
page: mdx,
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
};
diff --git a/packages/grafana-ui/src/components/Link/TextLink.story.tsx b/packages/grafana-ui/src/components/Link/TextLink.story.tsx
index 6c1b9eb5fff..b353b15674f 100644
--- a/packages/grafana-ui/src/components/Link/TextLink.story.tsx
+++ b/packages/grafana-ui/src/components/Link/TextLink.story.tsx
@@ -15,6 +15,8 @@ const meta: Meta = {
page: mdx,
},
controls: { exclude: ['href', 'external'] },
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
argTypes: {
variant: {
diff --git a/packages/grafana-ui/src/components/LoadingBar/LoadingBar.story.tsx b/packages/grafana-ui/src/components/LoadingBar/LoadingBar.story.tsx
index 3b6e412cb59..1d17511c54d 100644
--- a/packages/grafana-ui/src/components/LoadingBar/LoadingBar.story.tsx
+++ b/packages/grafana-ui/src/components/LoadingBar/LoadingBar.story.tsx
@@ -17,6 +17,8 @@ const meta: Meta = {
docs: {
page: mdx,
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
};
diff --git a/packages/grafana-ui/src/components/MatchersUI/FieldTypeMatcherEditor.tsx b/packages/grafana-ui/src/components/MatchersUI/FieldTypeMatcherEditor.tsx
index 129765470af..69736d2368d 100644
--- a/packages/grafana-ui/src/components/MatchersUI/FieldTypeMatcherEditor.tsx
+++ b/packages/grafana-ui/src/components/MatchersUI/FieldTypeMatcherEditor.tsx
@@ -27,20 +27,48 @@ FieldTypeMatcherEditor.displayName = 'FieldTypeMatcherEditor';
// Select options for all field types.
// This is not eported to the published package, but used internally
-export const allFieldTypeIconOptions: Array> = [
- { value: FieldType.number, label: 'Number', icon: getFieldTypeIconName(FieldType.number) },
- { value: FieldType.string, label: 'String', icon: getFieldTypeIconName(FieldType.string) },
- { value: FieldType.time, label: 'Time', icon: getFieldTypeIconName(FieldType.time) },
- { value: FieldType.boolean, label: 'Boolean', icon: getFieldTypeIconName(FieldType.boolean) },
- { value: FieldType.trace, label: 'Traces', icon: getFieldTypeIconName(FieldType.trace) },
- { value: FieldType.enum, label: 'Enum', icon: getFieldTypeIconName(FieldType.enum) },
- { value: FieldType.other, label: 'Other', icon: getFieldTypeIconName(FieldType.other) },
+export const getAllFieldTypeIconOptions: () => Array> = () => [
+ {
+ value: FieldType.number,
+ label: t('grafana-ui.matchers-ui.get-all-field-type-icon-options.label-number', 'Number'),
+ icon: getFieldTypeIconName(FieldType.number),
+ },
+ {
+ value: FieldType.string,
+ label: t('grafana-ui.matchers-ui.get-all-field-type-icon-options.label-string', 'String'),
+ icon: getFieldTypeIconName(FieldType.string),
+ },
+ {
+ value: FieldType.time,
+ label: t('grafana-ui.matchers-ui.get-all-field-type-icon-options.label-time', 'Time'),
+ icon: getFieldTypeIconName(FieldType.time),
+ },
+ {
+ value: FieldType.boolean,
+ label: t('grafana-ui.matchers-ui.get-all-field-type-icon-options.label-boolean', 'Boolean'),
+ icon: getFieldTypeIconName(FieldType.boolean),
+ },
+ {
+ value: FieldType.trace,
+ label: t('grafana-ui.matchers-ui.get-all-field-type-icon-options.label-traces', 'Traces'),
+ icon: getFieldTypeIconName(FieldType.trace),
+ },
+ {
+ value: FieldType.enum,
+ label: t('grafana-ui.matchers-ui.get-all-field-type-icon-options.label-enum', 'Enum'),
+ icon: getFieldTypeIconName(FieldType.enum),
+ },
+ {
+ value: FieldType.other,
+ label: t('grafana-ui.matchers-ui.get-all-field-type-icon-options.label-other', 'Other'),
+ icon: getFieldTypeIconName(FieldType.other),
+ },
];
const useFieldCounts = (data: DataFrame[]): Map => {
return useMemo(() => {
const counts: Map = new Map();
- for (const t of allFieldTypeIconOptions) {
+ for (const t of getAllFieldTypeIconOptions()) {
counts.set(t.value!, 0);
}
for (const frame of data) {
@@ -61,7 +89,7 @@ const useSelectOptions = (counts: Map, opt?: string): Array {
let found = false;
const options: Array> = [];
- for (const t of allFieldTypeIconOptions) {
+ for (const t of getAllFieldTypeIconOptions()) {
const count = counts.get(t.value!);
const match = opt === t.value;
if (count || match) {
diff --git a/packages/grafana-ui/src/components/MatchersUI/FieldsByFrameRefIdMatcher.tsx b/packages/grafana-ui/src/components/MatchersUI/FieldsByFrameRefIdMatcher.tsx
index 3a7b7146c43..87175cbb057 100644
--- a/packages/grafana-ui/src/components/MatchersUI/FieldsByFrameRefIdMatcher.tsx
+++ b/packages/grafana-ui/src/components/MatchersUI/FieldsByFrameRefIdMatcher.tsx
@@ -199,7 +199,9 @@ function getListOfQueryRefIds(data: DataFrame[]): Array>
for (const [refId, frames] of queries.entries()) {
values.push({
value: refId,
- label: `Query: ${refId ?? '(missing refId)'}`,
+ label: refId
+ ? t('grafana-ui.matchers-ui.get-list-of-query-ref-ids.label', 'Query: {{refId}}', { refId })
+ : t('grafana-ui.matchers-ui.get-list-of-query-ref-ids.label-missing-ref-id', 'Query: (missing refId)'),
description: getFramesDescription(frames),
});
}
@@ -208,11 +210,17 @@ function getListOfQueryRefIds(data: DataFrame[]): Array>
}
function getFramesDescription(frames: DataFrame[]): string {
- return `Frames (${frames.length}):
- ${frames
- .slice(0, Math.min(3, frames.length))
- .map((x) => getFrameDisplayName(x))
- .join(', ')} ${frames.length > 3 ? '...' : ''}`;
+ return t(
+ 'grafana-ui.matchers-ui.get-list-of-query-ref-ids.description',
+ 'Frames ({{framesCount}}): {{framesNames}}',
+ {
+ framesCount: frames.length,
+ framesNames: `${frames
+ .slice(0, Math.min(3, frames.length))
+ .map((x) => getFrameDisplayName(x))
+ .join(', ')} ${frames.length > 3 ? '...' : ''}`,
+ }
+ );
}
/**
diff --git a/packages/grafana-ui/src/components/Menu/Menu.story.tsx b/packages/grafana-ui/src/components/Menu/Menu.story.tsx
index d0ea0726b3a..131486ce175 100644
--- a/packages/grafana-ui/src/components/Menu/Menu.story.tsx
+++ b/packages/grafana-ui/src/components/Menu/Menu.story.tsx
@@ -24,6 +24,8 @@ const meta: Meta = {
actions: {
disabled: true,
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
};
diff --git a/packages/grafana-ui/src/components/Modal/Modal.story.tsx b/packages/grafana-ui/src/components/Modal/Modal.story.tsx
index 92e8e13348c..df05238cb3a 100644
--- a/packages/grafana-ui/src/components/Modal/Modal.story.tsx
+++ b/packages/grafana-ui/src/components/Modal/Modal.story.tsx
@@ -21,6 +21,8 @@ const meta: Meta = {
controls: {
exclude: ['className', 'contentClassName', 'onDismiss', 'onClickBackdrop'],
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
args: {
body: oneLineTrim(`Id incididunt do pariatur qui labore. Sint culpa irure cillum et ullamco proident. Deserunt ipsum velit dolore est enim proident dolore consectetur. Et cillum tempor pariatur et. Est tempor cillum ad id nulla. Cillum ut proident
diff --git a/packages/grafana-ui/src/components/PageLayout/PageToolbar.story.tsx b/packages/grafana-ui/src/components/PageLayout/PageToolbar.story.tsx
index 4a308a6d0be..d7a85381e9e 100644
--- a/packages/grafana-ui/src/components/PageLayout/PageToolbar.story.tsx
+++ b/packages/grafana-ui/src/components/PageLayout/PageToolbar.story.tsx
@@ -11,7 +11,10 @@ import { PageToolbar } from './PageToolbar';
const meta: Meta = {
title: 'Navigation/Deprecated/PageToolbar',
component: PageToolbar,
- parameters: {},
+ parameters: {
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
+ },
};
export const Examples = () => {
diff --git a/packages/grafana-ui/src/components/PanelChrome/PanelChrome.story.tsx b/packages/grafana-ui/src/components/PanelChrome/PanelChrome.story.tsx
index e401f94a162..afefc6b7968 100644
--- a/packages/grafana-ui/src/components/PanelChrome/PanelChrome.story.tsx
+++ b/packages/grafana-ui/src/components/PanelChrome/PanelChrome.story.tsx
@@ -31,6 +31,8 @@ const meta: Meta = {
docs: {
page: mdx,
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
};
diff --git a/packages/grafana-ui/src/components/QueryField/QueryField.story.tsx b/packages/grafana-ui/src/components/QueryField/QueryField.story.tsx
index 4b11c87e4ac..f0f672fa120 100644
--- a/packages/grafana-ui/src/components/QueryField/QueryField.story.tsx
+++ b/packages/grafana-ui/src/components/QueryField/QueryField.story.tsx
@@ -24,6 +24,8 @@ const meta: Meta = {
'syntaxLoaded',
],
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
argTypes: {
query: {
diff --git a/packages/grafana-ui/src/components/ScrollContainer/ScrollContainer.mdx b/packages/grafana-ui/src/components/ScrollContainer/ScrollContainer.mdx
index a9b0213ea5e..67ced9d65fe 100644
--- a/packages/grafana-ui/src/components/ScrollContainer/ScrollContainer.mdx
+++ b/packages/grafana-ui/src/components/ScrollContainer/ScrollContainer.mdx
@@ -30,7 +30,6 @@ If you were using additional props, there are roughly 3 categories of changes:
- `hideHorizontalTrack` and `hideVerticalTrack` have been removed.
- You can achieve the same behavior by setting either `overflowX` or `overflowY` to `hidden`. These names more closely match the CSS properties they represent.
- `scrollTop` and `setScrollTop`.
-
- You can achieve the same behavior by using the `ref` prop to get a reference to the `ScrollContainer` component, and then calling `scrollTo` on that reference.
- Before:
diff --git a/packages/grafana-ui/src/components/ScrollContainer/ScrollContainer.story.tsx b/packages/grafana-ui/src/components/ScrollContainer/ScrollContainer.story.tsx
index 2d3cf51788a..a6dfbf973eb 100644
--- a/packages/grafana-ui/src/components/ScrollContainer/ScrollContainer.story.tsx
+++ b/packages/grafana-ui/src/components/ScrollContainer/ScrollContainer.story.tsx
@@ -14,6 +14,8 @@ const meta: Meta = {
docs: {
page: mdx,
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
argTypes: {},
args: {
diff --git a/packages/grafana-ui/src/components/Segment/Segment.story.tsx b/packages/grafana-ui/src/components/Segment/Segment.story.tsx
index 91ae6c47bfb..982776c5415 100644
--- a/packages/grafana-ui/src/components/Segment/Segment.story.tsx
+++ b/packages/grafana-ui/src/components/Segment/Segment.story.tsx
@@ -62,6 +62,10 @@ export const ArrayOptions = () => {
const meta: Meta = {
title: 'Inputs/Segment',
component: Segment,
+ parameters: {
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
+ },
};
export const ArrayOptionsWithPrimitiveValue = () => {
diff --git a/packages/grafana-ui/src/components/Segment/SegmentAsync.story.tsx b/packages/grafana-ui/src/components/Segment/SegmentAsync.story.tsx
index 9b64c2fca74..fa4b97b477b 100644
--- a/packages/grafana-ui/src/components/Segment/SegmentAsync.story.tsx
+++ b/packages/grafana-ui/src/components/Segment/SegmentAsync.story.tsx
@@ -63,6 +63,10 @@ export const ArrayOptions = () => {
const meta: Meta = {
title: 'Inputs/SegmentAsync',
component: SegmentAsync,
+ parameters: {
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
+ },
};
export const ArrayOptionsWithPrimitiveValue = () => {
diff --git a/packages/grafana-ui/src/components/Segment/SegmentInput.story.tsx b/packages/grafana-ui/src/components/Segment/SegmentInput.story.tsx
index 780f6b4aba2..74af7d58fda 100644
--- a/packages/grafana-ui/src/components/Segment/SegmentInput.story.tsx
+++ b/packages/grafana-ui/src/components/Segment/SegmentInput.story.tsx
@@ -32,6 +32,10 @@ export const BasicInput = () => {
const meta: Meta = {
title: 'Inputs/SegmentInput',
component: SegmentInput,
+ parameters: {
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
+ },
};
export const BasicInputWithPlaceholder = () => {
diff --git a/packages/grafana-ui/src/components/Select/Select.story.tsx b/packages/grafana-ui/src/components/Select/Select.story.tsx
index 7e8388442a1..bf3a92de89a 100644
--- a/packages/grafana-ui/src/components/Select/Select.story.tsx
+++ b/packages/grafana-ui/src/components/Select/Select.story.tsx
@@ -72,6 +72,8 @@ const meta: Meta = {
'value',
],
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
args: {
width: 0,
diff --git a/packages/grafana-ui/src/components/Select/SelectPerf.story.tsx b/packages/grafana-ui/src/components/Select/SelectPerf.story.tsx
index 357eee70561..8a5ff8f9433 100644
--- a/packages/grafana-ui/src/components/Select/SelectPerf.story.tsx
+++ b/packages/grafana-ui/src/components/Select/SelectPerf.story.tsx
@@ -16,6 +16,10 @@ const meta: Meta = {
control: { type: 'number' },
},
},
+ parameters: {
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
+ },
};
export default meta;
diff --git a/packages/grafana-ui/src/components/Slider/RangeSlider.story.tsx b/packages/grafana-ui/src/components/Slider/RangeSlider.story.tsx
index eccb916483a..d00648bdfbe 100644
--- a/packages/grafana-ui/src/components/Slider/RangeSlider.story.tsx
+++ b/packages/grafana-ui/src/components/Slider/RangeSlider.story.tsx
@@ -9,6 +9,8 @@ const meta: Meta = {
controls: {
exclude: ['tooltipAlwaysVisible'],
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
argTypes: {
orientation: { control: { type: 'select', options: ['horizontal', 'vertical'] } },
diff --git a/packages/grafana-ui/src/components/Slider/Slider.story.tsx b/packages/grafana-ui/src/components/Slider/Slider.story.tsx
index a4180712444..770038dbc64 100644
--- a/packages/grafana-ui/src/components/Slider/Slider.story.tsx
+++ b/packages/grafana-ui/src/components/Slider/Slider.story.tsx
@@ -12,6 +12,8 @@ const meta: Meta = {
knobs: {
disabled: true,
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
argTypes: {
orientation: { control: { type: 'select', options: ['horizontal', 'vertical'] } },
diff --git a/packages/grafana-ui/src/components/StatsPicker/StatsPicker.story.tsx b/packages/grafana-ui/src/components/StatsPicker/StatsPicker.story.tsx
index 7e20cb9288f..3487a13693f 100644
--- a/packages/grafana-ui/src/components/StatsPicker/StatsPicker.story.tsx
+++ b/packages/grafana-ui/src/components/StatsPicker/StatsPicker.story.tsx
@@ -43,6 +43,8 @@ const meta: Meta = {
controls: {
exclude: ['onChange', 'stats', 'defaultStat', 'className'],
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
};
diff --git a/packages/grafana-ui/src/components/Switch/Switch.story.tsx b/packages/grafana-ui/src/components/Switch/Switch.story.tsx
index ae4786d0fe5..67a9567a2d5 100644
--- a/packages/grafana-ui/src/components/Switch/Switch.story.tsx
+++ b/packages/grafana-ui/src/components/Switch/Switch.story.tsx
@@ -16,6 +16,8 @@ const meta: Meta = {
docs: {
page: mdx,
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
args: {
disabled: false,
diff --git a/packages/grafana-ui/src/components/Table/DataLinksActionsTooltip.tsx b/packages/grafana-ui/src/components/Table/DataLinksActionsTooltip.tsx
index 5b2e28c646f..6686f76d49b 100644
--- a/packages/grafana-ui/src/components/Table/DataLinksActionsTooltip.tsx
+++ b/packages/grafana-ui/src/components/Table/DataLinksActionsTooltip.tsx
@@ -1,7 +1,6 @@
import { css } from '@emotion/css';
import { flip, shift, useDismiss, useFloating, useInteractions } from '@floating-ui/react';
-import { ReactElement, useMemo } from 'react';
-import * as React from 'react';
+import { useMemo, ReactNode } from 'react';
import { ActionModel, GrafanaTheme2, LinkModel } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors';
@@ -16,7 +15,7 @@ import { DataLinksActionsTooltipCoords } from './utils';
interface Props {
links: LinkModel[];
actions?: ActionModel[];
- value?: string | ReactElement;
+ value?: ReactNode;
coords: DataLinksActionsTooltipCoords;
onTooltipClose?: () => void;
}
@@ -102,11 +101,7 @@ export const DataLinksActionsTooltip = ({ links, actions, value, coords, onToolt
);
};
-export const renderSingleLink = (
- link: LinkModel,
- children: string | React.JSX.Element,
- className?: string
-): React.JSX.Element => {
+export const renderSingleLink = (link: LinkModel, children: ReactNode, className?: string): ReactNode => {
return (
= {
docs: {
page: mdx,
},
+ // TODO fix a11y issue in story and remove this
+ a11y: { test: 'off' },
},
args: {
width: 700,
diff --git a/packages/grafana-ui/src/components/Table/TableNG/Cells/AutoCell.tsx b/packages/grafana-ui/src/components/Table/TableNG/Cells/AutoCell.tsx
index 45427f703e8..43de0b5bb1e 100644
--- a/packages/grafana-ui/src/components/Table/TableNG/Cells/AutoCell.tsx
+++ b/packages/grafana-ui/src/components/Table/TableNG/Cells/AutoCell.tsx
@@ -1,13 +1,14 @@
import { formattedValueToString } from '@grafana/data';
-import { renderSingleLink } from '../../DataLinksActionsTooltip';
-import { useSingleLink } from '../hooks';
+import { MaybeWrapWithLink } from '../MaybeWrapWithLink';
import { AutoCellProps } from '../types';
export default function AutoCell({ value, field, rowIdx }: AutoCellProps) {
const displayValue = field.display!(value);
const formattedValue = formattedValueToString(displayValue);
- const link = useSingleLink(field, rowIdx);
-
- return link != null ? renderSingleLink(link, formattedValue) : formattedValue;
+ return (
+
+ {formattedValue}
+
+ );
}
diff --git a/packages/grafana-ui/src/components/Table/TableNG/Cells/BarGaugeCell.tsx b/packages/grafana-ui/src/components/Table/TableNG/Cells/BarGaugeCell.tsx
index 69ebfac671c..3f762218553 100644
--- a/packages/grafana-ui/src/components/Table/TableNG/Cells/BarGaugeCell.tsx
+++ b/packages/grafana-ui/src/components/Table/TableNG/Cells/BarGaugeCell.tsx
@@ -2,8 +2,7 @@ import { ThresholdsConfig, ThresholdsMode, VizOrientation, getFieldConfigWithMin
import { BarGaugeDisplayMode, BarGaugeValueMode, TableCellDisplayMode } from '@grafana/schema';
import { BarGauge } from '../../../BarGauge/BarGauge';
-import { renderSingleLink } from '../../DataLinksActionsTooltip';
-import { useSingleLink } from '../hooks';
+import { MaybeWrapWithLink } from '../MaybeWrapWithLink';
import { BarGaugeCellProps } from '../types';
import { extractPixelValue, getCellOptions, getAlignmentFactor } from '../utils';
@@ -47,25 +46,23 @@ export const BarGaugeCell = ({ value, field, theme, height, width, rowIdx }: Bar
const alignmentFactors = getAlignmentFactor(field, displayValue, rowIdx!);
- const barGaugeComponent = (
-
+ return (
+
+
+
);
-
- const link = useSingleLink(field, rowIdx);
-
- return link == null ? barGaugeComponent : renderSingleLink(link, barGaugeComponent);
};
diff --git a/packages/grafana-ui/src/components/Table/TableNG/Cells/DataLinksCell.tsx b/packages/grafana-ui/src/components/Table/TableNG/Cells/DataLinksCell.tsx
index a83a623ee88..5fafb04765a 100644
--- a/packages/grafana-ui/src/components/Table/TableNG/Cells/DataLinksCell.tsx
+++ b/packages/grafana-ui/src/components/Table/TableNG/Cells/DataLinksCell.tsx
@@ -1,42 +1,16 @@
-import { css } from '@emotion/css';
-
-import { GrafanaTheme2 } from '@grafana/data';
-
-import { useStyles2 } from '../../../../themes/ThemeContext';
import { DataLinksCellProps } from '../types';
import { getCellLinks } from '../utils';
export const DataLinksCell = ({ field, rowIdx }: DataLinksCellProps) => {
- const styles = useStyles2(getStyles);
+ const links = getCellLinks(field, rowIdx);
- const links = getCellLinks(field, rowIdx!);
+ if (!links?.length) {
+ return null;
+ }
- return (
-