diff --git a/packages/grafana-data/src/types/featureToggles.gen.ts b/packages/grafana-data/src/types/featureToggles.gen.ts index 3316e91792d..15b138e4ff7 100644 --- a/packages/grafana-data/src/types/featureToggles.gen.ts +++ b/packages/grafana-data/src/types/featureToggles.gen.ts @@ -401,6 +401,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 */ 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/timeseries/panelcfg/x/TimeSeriesPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/timeseries/panelcfg/x/TimeSeriesPanelCfg_types.gen.ts index b34b0b7e301..8b9d3d48053 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 @@ -15,6 +15,7 @@ export const pluginVersion = "12.1.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-ui/src/options/builder/index.ts b/packages/grafana-ui/src/options/builder/index.ts index 42dd18e4850..98b376794ee 100644 --- a/packages/grafana-ui/src/options/builder/index.ts +++ b/packages/grafana-ui/src/options/builder/index.ts @@ -4,3 +4,4 @@ export * from './legend'; export { addTooltipOptions } from './tooltip'; export * from './text'; export * from './stacking'; +export { addTimeCompareOption } from './timeCompare'; diff --git a/packages/grafana-ui/src/options/builder/timeCompare.tsx b/packages/grafana-ui/src/options/builder/timeCompare.tsx new file mode 100644 index 00000000000..de19457d80f --- /dev/null +++ b/packages/grafana-ui/src/options/builder/timeCompare.tsx @@ -0,0 +1,19 @@ +import { PanelOptionsEditorBuilder } from '@grafana/data'; +import { TimeCompareOptions } from '@grafana/schema'; + +/** + * Adds a generic time comparison option to the panel options editor. + * Can be used by any panel that supports time comparison. + */ +export function addTimeCompareOption( + builder: PanelOptionsEditorBuilder, + defaultValue = false +) { + builder.addBooleanSwitch({ + path: 'timeCompare', + name: 'Enable', + category: ['Time Comparison'], + description: '', + defaultValue, + }); +} diff --git a/pkg/services/featuremgmt/registry.go b/pkg/services/featuremgmt/registry.go index 8958d488a3c..4fdb2c87c27 100644 --- a/pkg/services/featuremgmt/registry.go +++ b/pkg/services/featuremgmt/registry.go @@ -667,6 +667,13 @@ var ( FrontendOnly: true, Owner: grafanaDatavizSquad, }, + { + Name: "timeComparison", + Description: "Enables time comparison option in supported panels", + Stage: FeatureStageExperimental, + FrontendOnly: true, + Owner: grafanaDatavizSquad, + }, { Name: "logsInfiniteScrolling", Description: "Enables infinite scrolling for the Logs panel in Explore and Dashboards", diff --git a/pkg/services/featuremgmt/toggles_gen.csv b/pkg/services/featuremgmt/toggles_gen.csv index b4cc812bf54..531ac398257 100644 --- a/pkg/services/featuremgmt/toggles_gen.csv +++ b/pkg/services/featuremgmt/toggles_gen.csv @@ -88,6 +88,7 @@ dashboardNewLayouts,experimental,@grafana/dashboards-squad,false,false,true panelFilterVariable,experimental,@grafana/dashboards-squad,false,false,true pdfTables,preview,@grafana/grafana-operator-experience-squad,false,false,false canvasPanelPanZoom,preview,@grafana/dataviz-squad,false,false,true +timeComparison,experimental,@grafana/dataviz-squad,false,false,true logsInfiniteScrolling,GA,@grafana/observability-logs,false,false,true logRowsPopoverMenu,GA,@grafana/observability-logs,false,false,true pluginsSkipHostEnvVars,experimental,@grafana/plugins-platform-backend,false,false,false diff --git a/pkg/services/featuremgmt/toggles_gen.go b/pkg/services/featuremgmt/toggles_gen.go index 43a51188253..96930b299c9 100644 --- a/pkg/services/featuremgmt/toggles_gen.go +++ b/pkg/services/featuremgmt/toggles_gen.go @@ -363,6 +363,10 @@ const ( // Allow pan and zoom in canvas panel FlagCanvasPanelPanZoom = "canvasPanelPanZoom" + // FlagTimeComparison + // Enables time comparison option in supported panels + FlagTimeComparison = "timeComparison" + // FlagLogsInfiniteScrolling // Enables infinite scrolling for the Logs panel in Explore and Dashboards FlagLogsInfiniteScrolling = "logsInfiniteScrolling" diff --git a/pkg/services/featuremgmt/toggles_gen.json b/pkg/services/featuremgmt/toggles_gen.json index c1915403da5..08c49aac219 100644 --- a/pkg/services/featuremgmt/toggles_gen.json +++ b/pkg/services/featuremgmt/toggles_gen.json @@ -6,7 +6,7 @@ { "metadata": { "name": "addFieldFromCalculationStatFunctions", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-11-03T14:39:58Z" }, "spec": { @@ -20,7 +20,7 @@ { "metadata": { "name": "aiGeneratedDashboardChanges", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-03-05T12:01:31Z" }, "spec": { @@ -33,7 +33,7 @@ { "metadata": { "name": "alertEnrichment", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-06-06T12:16:07Z" }, "spec": { @@ -48,7 +48,7 @@ { "metadata": { "name": "alertRuleRestore", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-03-05T14:15:26Z" }, "spec": { @@ -61,7 +61,7 @@ { "metadata": { "name": "alertRuleUseFiredAtForStartsAt", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-04-22T11:16:38Z" }, "spec": { @@ -74,11 +74,8 @@ { "metadata": { "name": "alertingAIAnalyzeCentralStateHistory", - "resourceVersion": "1752215431801", - "creationTimestamp": "2025-07-07T14:40:14Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-07-11 06:30:31.801024 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-07-23T15:38:49Z" }, "spec": { "description": "Enable AI-analyze central state history.", @@ -92,8 +89,8 @@ { "metadata": { "name": "alertingAIFeedback", - "resourceVersion": "1752820131286", - "creationTimestamp": "2025-07-18T06:28:51Z" + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-07-23T15:38:49Z" }, "spec": { "description": "Enable AI-generated feedback from the Grafana UI.", @@ -107,11 +104,8 @@ { "metadata": { "name": "alertingAIGenAlertRules", - "resourceVersion": "1752215431801", - "creationTimestamp": "2025-07-07T14:40:14Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-07-11 06:30:31.801024 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-07-23T15:38:49Z" }, "spec": { "description": "Enable AI-generated alert rules.", @@ -125,11 +119,8 @@ { "metadata": { "name": "alertingAIGenTemplates", - "resourceVersion": "1752215431801", - "creationTimestamp": "2025-07-07T14:40:14Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-07-11 06:30:31.801024 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-07-23T15:38:49Z" }, "spec": { "description": "Enable AI-generated alerting templates.", @@ -143,11 +134,8 @@ { "metadata": { "name": "alertingAIImproveAlertRules", - "resourceVersion": "1752215431801", - "creationTimestamp": "2025-07-07T14:40:14Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-07-11 06:30:31.801024 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-07-23T15:38:49Z" }, "spec": { "description": "Enable AI-improve alert rules labels and annotations.", @@ -161,7 +149,7 @@ { "metadata": { "name": "alertingBacktesting", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2022-12-14T14:44:14Z" }, "spec": { @@ -173,7 +161,7 @@ { "metadata": { "name": "alertingBulkActionsInUI", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-04-24T14:49:59Z" }, "spec": { @@ -189,7 +177,7 @@ { "metadata": { "name": "alertingCentralAlertHistory", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-05-29T15:01:38Z" }, "spec": { @@ -202,7 +190,7 @@ { "metadata": { "name": "alertingDisableSendAlertsExternal", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-05-23T12:29:19Z" }, "spec": { @@ -216,7 +204,7 @@ { "metadata": { "name": "alertingFilterV2", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-09-11T11:29:26Z" }, "spec": { @@ -229,7 +217,7 @@ { "metadata": { "name": "alertingImportAlertmanagerAPI", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-06-10T08:32:50Z" }, "spec": { @@ -244,7 +232,7 @@ { "metadata": { "name": "alertingImportYAMLUI", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-05-21T15:59:41Z" }, "spec": { @@ -258,7 +246,7 @@ { "metadata": { "name": "alertingJiraIntegration", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-02-14T12:22:04Z" }, "spec": { @@ -272,7 +260,7 @@ { "metadata": { "name": "alertingListViewV2", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-05-24T14:40:49Z" }, "spec": { @@ -285,7 +273,7 @@ { "metadata": { "name": "alertingListViewV2PreviewToggle", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-04-22T08:50:34Z" }, "spec": { @@ -298,7 +286,7 @@ { "metadata": { "name": "alertingMigrationUI", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-03-14T16:40:05Z" }, "spec": { @@ -312,8 +300,8 @@ { "metadata": { "name": "alertingNotificationHistory", - "resourceVersion": "1752682072771", - "creationTimestamp": "2025-07-16T16:07:52Z" + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-07-23T15:38:49Z" }, "spec": { "description": "Enables the notification history feature", @@ -327,7 +315,7 @@ { "metadata": { "name": "alertingNotificationsStepMode", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-11-22T11:07:45Z" }, "spec": { @@ -341,7 +329,7 @@ { "metadata": { "name": "alertingPrometheusRulesPrimary", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-09-27T12:27:16Z" }, "spec": { @@ -368,7 +356,7 @@ { "metadata": { "name": "alertingQueryAndExpressionsStepMode", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-09-26T06:33:14Z" }, "spec": { @@ -382,7 +370,7 @@ { "metadata": { "name": "alertingQueryOptimization", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-01-10T20:52:58Z" }, "spec": { @@ -395,7 +383,7 @@ { "metadata": { "name": "alertingRulePermanentlyDelete", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-04-03T11:18:25Z" }, "spec": { @@ -411,7 +399,7 @@ { "metadata": { "name": "alertingRuleRecoverDeleted", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-03-27T14:39:26Z" }, "spec": { @@ -427,7 +415,7 @@ { "metadata": { "name": "alertingRuleVersionHistoryRestore", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-02-17T12:25:32Z" }, "spec": { @@ -443,7 +431,7 @@ { "metadata": { "name": "alertingSaveStateCompressed", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-01-27T17:47:33Z" }, "spec": { @@ -456,7 +444,7 @@ { "metadata": { "name": "alertingSaveStatePeriodic", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-01-23T16:03:30Z" }, "spec": { @@ -468,7 +456,7 @@ { "metadata": { "name": "alertingUIOptimizeReducer", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-11-18T10:59:00Z" }, "spec": { @@ -482,7 +470,7 @@ { "metadata": { "name": "alertmanagerRemotePrimary", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-10-30T16:27:08Z" }, "spec": { @@ -494,7 +482,7 @@ { "metadata": { "name": "alertmanagerRemoteSecondary", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-10-30T16:27:08Z" }, "spec": { @@ -503,25 +491,10 @@ "codeowner": "@grafana/alerting-squad" } }, - { - "metadata": { - "name": "angularDeprecationUI", - "resourceVersion": "1750434297879", - "creationTimestamp": "2023-08-29T14:05:47Z", - "deletionTimestamp": "2025-06-27T11:02:00Z" - }, - "spec": { - "description": "Display Angular warnings in dashboards and panels", - "stage": "GA", - "codeowner": "@grafana/plugins-platform-backend", - "frontend": true, - "expression": "true" - } - }, { "metadata": { "name": "annotationPermissionUpdate", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-10-31T13:30:13Z" }, "spec": { @@ -534,7 +507,7 @@ { "metadata": { "name": "appPlatformGrpcClientAuth", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-10-14T10:47:18Z" }, "spec": { @@ -548,7 +521,7 @@ { "metadata": { "name": "assetSriChecks", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-03-04T10:56:35Z" }, "spec": { @@ -561,7 +534,7 @@ { "metadata": { "name": "authZGRPCServer", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-06-13T09:41:35Z" }, "spec": { @@ -575,7 +548,7 @@ { "metadata": { "name": "awsAsyncQueryCaching", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-07-21T15:34:07Z" }, "spec": { @@ -588,11 +561,8 @@ { "metadata": { "name": "awsDatasourcesTempCredentials", - "resourceVersion": "1752523189825", - "creationTimestamp": "2023-07-06T15:06:11Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-07-14 19:59:49.825959 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2023-07-06T15:06:11Z" }, "spec": { "description": "Support temporary security credentials in AWS plugins for Grafana Cloud customers", @@ -604,7 +574,7 @@ { "metadata": { "name": "azureMonitorDisableLogLimit", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-10-24T13:32:09Z" }, "spec": { @@ -617,7 +587,7 @@ { "metadata": { "name": "azureMonitorEnableUserAuth", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-11-27T14:01:54Z" }, "spec": { @@ -630,7 +600,7 @@ { "metadata": { "name": "azureMonitorLogsBuilderEditor", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-04-02T14:15:25Z" }, "spec": { @@ -643,7 +613,7 @@ { "metadata": { "name": "azureMonitorPrometheusExemplars", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-06-06T16:53:17Z" }, "spec": { @@ -656,7 +626,7 @@ { "metadata": { "name": "cachingOptimizeSerializationMemoryUsage", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-10-12T16:56:49Z" }, "spec": { @@ -668,7 +638,7 @@ { "metadata": { "name": "canvasPanelNesting", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2022-05-31T19:03:34Z" }, "spec": { @@ -682,7 +652,7 @@ { "metadata": { "name": "canvasPanelPanZoom", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-01-02T19:52:21Z" }, "spec": { @@ -695,7 +665,7 @@ { "metadata": { "name": "cloudRBACRoles", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-01-10T13:19:01Z" }, "spec": { @@ -711,7 +681,7 @@ { "metadata": { "name": "cloudWatchBatchQueries", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-10-20T19:09:41Z" }, "spec": { @@ -723,7 +693,7 @@ { "metadata": { "name": "cloudWatchCrossAccountQuerying", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2022-11-28T11:39:12Z" }, "spec": { @@ -737,7 +707,7 @@ { "metadata": { "name": "cloudWatchNewLabelParsing", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-04-05T15:57:56Z" }, "spec": { @@ -750,7 +720,7 @@ { "metadata": { "name": "cloudWatchRoundUpEndTime", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-06-27T15:10:28Z" }, "spec": { @@ -763,7 +733,7 @@ { "metadata": { "name": "configurableSchedulerTick", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-07-26T16:44:12Z" }, "spec": { @@ -777,7 +747,7 @@ { "metadata": { "name": "correlations", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2022-09-16T13:14:27Z" }, "spec": { @@ -791,7 +761,7 @@ { "metadata": { "name": "crashDetection", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-11-12T15:07:27Z" }, "spec": { @@ -804,7 +774,7 @@ { "metadata": { "name": "dashboardDisableSchemaValidationV1", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-04-11T16:52:46Z" }, "spec": { @@ -816,7 +786,7 @@ { "metadata": { "name": "dashboardDisableSchemaValidationV2", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-04-11T16:52:46Z" }, "spec": { @@ -828,8 +798,8 @@ { "metadata": { "name": "dashboardDsAdHocFiltering", - "resourceVersion": "1752487974435", - "creationTimestamp": "2025-07-14T10:12:54Z" + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-07-23T15:38:49Z" }, "spec": { "description": "Enables adhoc filtering support for the dashboard datasource", @@ -841,7 +811,7 @@ { "metadata": { "name": "dashboardNewLayouts", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-10-23T08:55:45Z" }, "spec": { @@ -854,7 +824,7 @@ { "metadata": { "name": "dashboardScene", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-11-13T08:51:21Z" }, "spec": { @@ -868,7 +838,7 @@ { "metadata": { "name": "dashboardSceneForViewers", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-11-02T19:02:25Z" }, "spec": { @@ -882,7 +852,7 @@ { "metadata": { "name": "dashboardSceneSolo", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-02-11T08:08:47Z" }, "spec": { @@ -896,7 +866,7 @@ { "metadata": { "name": "dashboardSchemaValidationLogging", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-04-11T16:52:46Z" }, "spec": { @@ -908,7 +878,7 @@ { "metadata": { "name": "dashgpt", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-08-30T20:22:05Z" }, "spec": { @@ -922,7 +892,7 @@ { "metadata": { "name": "dataplaneAggregator", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-08-09T08:41:07Z" }, "spec": { @@ -935,7 +905,7 @@ { "metadata": { "name": "dataplaneFrontendFallback", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-04-07T21:13:19Z" }, "spec": { @@ -950,7 +920,7 @@ { "metadata": { "name": "datasourceAPIServers", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-09-19T08:28:27Z" }, "spec": { @@ -963,7 +933,7 @@ { "metadata": { "name": "datasourceConnectionsTab", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-01-21T17:39:48Z" }, "spec": { @@ -976,7 +946,7 @@ { "metadata": { "name": "datasourceQueryTypes", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-05-23T16:46:28Z" }, "spec": { @@ -989,7 +959,7 @@ { "metadata": { "name": "disableClassicHTTPHistogram", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-06-18T19:37:44Z" }, "spec": { @@ -1003,7 +973,7 @@ { "metadata": { "name": "disableEnvelopeEncryption", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2022-05-24T08:34:47Z" }, "spec": { @@ -1017,7 +987,7 @@ { "metadata": { "name": "disableNumericMetricsSortingInExpressions", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-04-16T14:52:47Z" }, "spec": { @@ -1030,7 +1000,7 @@ { "metadata": { "name": "disableSSEDataplane", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-04-12T16:24:34Z" }, "spec": { @@ -1042,7 +1012,7 @@ { "metadata": { "name": "editPanelCSVDragAndDrop", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-01-24T09:43:44Z" }, "spec": { @@ -1055,7 +1025,7 @@ { "metadata": { "name": "elasticsearchCrossClusterSearch", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-12-12T22:20:04Z" }, "spec": { @@ -1067,7 +1037,7 @@ { "metadata": { "name": "elasticsearchImprovedParsing", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-01-15T17:05:54Z" }, "spec": { @@ -1079,25 +1049,8 @@ { "metadata": { "name": "enableAppChromeExtensions", - "resourceVersion": "1750235111726", - "creationTimestamp": "2025-06-18T08:25:11Z" - }, - "spec": { - "description": "Set this to true to enable all app chrome extensions registered by plugins.", - "stage": "experimental", - "codeowner": "@grafana/plugins-platform-backend", - "frontend": true, - "hideFromAdminPage": true, - "hideFromDocs": true, - "expression": "false" - } - }, - { - "metadata": { - "name": "enableAppChromeExtensions", - "resourceVersion": "1751899214406", - "creationTimestamp": "2025-07-07T14:40:14Z", - "deletionTimestamp": "2025-07-07T15:15:21Z" + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-07-23T15:38:49Z" }, "spec": { "description": "Set this to true to enable all app chrome extensions registered by plugins.", @@ -1112,7 +1065,7 @@ { "metadata": { "name": "enableDatagridEditing", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-04-24T14:46:31Z" }, "spec": { @@ -1125,7 +1078,7 @@ { "metadata": { "name": "enableExtensionsAdminPage", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-11-05T15:55:10Z" }, "spec": { @@ -1138,7 +1091,7 @@ { "metadata": { "name": "enableNativeHTTPHistogram", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-10-03T18:23:55Z" }, "spec": { @@ -1152,8 +1105,8 @@ { "metadata": { "name": "enablePluginImporter", - "resourceVersion": "1752591728321", - "creationTimestamp": "2025-07-15T15:02:08Z" + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-07-23T15:38:49Z" }, "spec": { "description": "Set this to true to use the new PluginImporter functionality", @@ -1168,11 +1121,8 @@ { "metadata": { "name": "enableSCIM", - "resourceVersion": "1750952338509", - "creationTimestamp": "2024-11-07T14:38:46Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-06-26 15:38:58.509301321 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2024-11-07T14:38:46Z" }, "spec": { "description": "Enables SCIM support for user and group management", @@ -1183,7 +1133,7 @@ { "metadata": { "name": "enableScopesInMetricsExplore", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-11-06T13:11:33Z" }, "spec": { @@ -1197,7 +1147,7 @@ { "metadata": { "name": "exploreLogsAggregatedMetrics", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-08-29T13:55:59Z" }, "spec": { @@ -1210,7 +1160,7 @@ { "metadata": { "name": "exploreLogsLimitedTimeRange", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-08-29T13:55:59Z" }, "spec": { @@ -1223,7 +1173,7 @@ { "metadata": { "name": "exploreLogsShardSplitting", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-08-29T13:55:59Z" }, "spec": { @@ -1236,7 +1186,7 @@ { "metadata": { "name": "exploreMetricsRelatedLogs", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-11-05T16:28:43Z" }, "spec": { @@ -1249,7 +1199,7 @@ { "metadata": { "name": "expressionParser", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-02-17T00:59:11Z" }, "spec": { @@ -1262,7 +1212,7 @@ { "metadata": { "name": "extensionSidebar", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-04-03T10:16:35Z" }, "spec": { @@ -1272,40 +1222,10 @@ "frontend": true } }, - { - "metadata": { - "name": "extensionsReadOnlyProxy", - "resourceVersion": "1750434297879", - "creationTimestamp": "2025-05-06T04:55:23Z", - "deletionTimestamp": "2025-06-30T08:24:11Z" - }, - "spec": { - "description": "Use proxy-based read-only objects for plugin extensions instead of deep cloning", - "stage": "experimental", - "codeowner": "@grafana/plugins-platform-backend", - "frontend": true, - "hideFromAdminPage": true, - "hideFromDocs": true - } - }, - { - "metadata": { - "name": "externalCorePlugins", - "resourceVersion": "1750434297879", - "creationTimestamp": "2023-09-22T08:50:13Z", - "deletionTimestamp": "2025-07-21T09:49:02Z" - }, - "spec": { - "description": "Allow core plugins to be loaded as external", - "stage": "GA", - "codeowner": "@grafana/plugins-platform-backend", - "expression": "true" - } - }, { "metadata": { "name": "externalServiceAccounts", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-09-28T07:26:37Z" }, "spec": { @@ -1318,7 +1238,7 @@ { "metadata": { "name": "extraThemes", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-05-10T13:37:04Z", "deletionTimestamp": "2025-05-20T08:18:08Z" }, @@ -1332,7 +1252,7 @@ { "metadata": { "name": "extractFieldsNameDeduplication", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-11-02T15:47:42Z" }, "spec": { @@ -1342,24 +1262,10 @@ "frontend": true } }, - { - "metadata": { - "name": "failWrongDSUID", - "resourceVersion": "1750434297879", - "creationTimestamp": "2024-06-20T10:56:39Z", - "deletionTimestamp": "2025-06-27T13:43:58Z" - }, - "spec": { - "description": "Throws an error if a data source has an invalid UIDs", - "stage": "GA", - "codeowner": "@grafana/plugins-platform-backend", - "expression": "true" - } - }, { "metadata": { "name": "faroDatasourceSelector", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-05-05T00:35:10Z" }, "spec": { @@ -1372,7 +1278,7 @@ { "metadata": { "name": "featureHighlights", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2022-02-03T11:53:23Z" }, "spec": { @@ -1386,7 +1292,7 @@ { "metadata": { "name": "featureToggleAdminPage", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-07-18T20:43:32Z" }, "spec": { @@ -1400,7 +1306,7 @@ { "metadata": { "name": "feedbackButton", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-12-02T17:08:15Z" }, "spec": { @@ -1413,7 +1319,7 @@ { "metadata": { "name": "fetchRulesUsingPost", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-01-29T12:17:44Z" }, "spec": { @@ -1427,8 +1333,8 @@ { "metadata": { "name": "foldersAppPlatformAPI", - "resourceVersion": "1751377081192", - "creationTimestamp": "2025-07-01T13:38:01Z" + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-07-23T15:38:49Z" }, "spec": { "description": "Enables use of app platform API for folders", @@ -1443,7 +1349,7 @@ { "metadata": { "name": "formatString", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-10-13T18:17:12Z" }, "spec": { @@ -1457,7 +1363,7 @@ { "metadata": { "name": "grafanaAPIServerEnsureKubectlAccess", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-12-06T20:21:21Z" }, "spec": { @@ -1471,7 +1377,7 @@ { "metadata": { "name": "grafanaAPIServerWithExperimentalAPIs", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-10-06T18:55:22Z" }, "spec": { @@ -1485,7 +1391,7 @@ { "metadata": { "name": "grafanaAdvisor", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-01-20T10:08:00Z" }, "spec": { @@ -1497,7 +1403,7 @@ { "metadata": { "name": "grafanaManagedRecordingRules", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-04-22T17:53:16Z", "deletionTimestamp": "2025-05-19T10:15:49Z" }, @@ -1512,7 +1418,7 @@ { "metadata": { "name": "grafanaconThemes", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-02-06T11:08:04Z" }, "spec": { @@ -1528,7 +1434,7 @@ { "metadata": { "name": "groupAttributeSync", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-09-09T15:29:43Z" }, "spec": { @@ -1541,7 +1447,7 @@ { "metadata": { "name": "groupByVariable", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-02-14T17:18:04Z" }, "spec": { @@ -1555,7 +1461,7 @@ { "metadata": { "name": "groupToNestedTableTransformation", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-02-07T14:28:26Z" }, "spec": { @@ -1569,7 +1475,7 @@ { "metadata": { "name": "grpcServer", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2022-09-26T20:25:34Z" }, "spec": { @@ -1582,11 +1488,8 @@ { "metadata": { "name": "improvedExternalSessionHandling", - "resourceVersion": "1751355094344", - "creationTimestamp": "2024-09-17T10:54:39Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-07-01 07:31:34.344238 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2024-09-17T10:54:39Z" }, "spec": { "description": "Enables improved support for OAuth external sessions. After enabling this feature, users might need to re-authenticate themselves.", @@ -1599,11 +1502,8 @@ { "metadata": { "name": "improvedExternalSessionHandlingSAML", - "resourceVersion": "1751355094344", - "creationTimestamp": "2025-01-09T17:02:49Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-07-01 07:31:34.344238 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-01-09T17:02:49Z" }, "spec": { "description": "Enables improved support for SAML external sessions. Ensure the NameID format is correctly configured in Grafana for SAML Single Logout to function properly.", @@ -1616,7 +1516,7 @@ { "metadata": { "name": "individualCookiePreferences", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-02-21T10:19:07Z" }, "spec": { @@ -1628,7 +1528,7 @@ { "metadata": { "name": "infinityRunQueriesInParallel", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-03-14T12:54:04Z" }, "spec": { @@ -1640,7 +1540,7 @@ { "metadata": { "name": "influxdbBackendMigration", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2022-02-09T18:26:16Z", "deletionTimestamp": "2023-01-17T14:11:26Z" }, @@ -1655,7 +1555,7 @@ { "metadata": { "name": "influxdbRunQueriesInParallel", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-02-01T10:58:24Z" }, "spec": { @@ -1667,7 +1567,7 @@ { "metadata": { "name": "influxqlStreamingParser", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-11-29T17:29:35Z" }, "spec": { @@ -1679,7 +1579,7 @@ { "metadata": { "name": "investigationsBackend", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-12-18T08:31:03Z" }, "spec": { @@ -1692,7 +1592,7 @@ { "metadata": { "name": "inviteUserExperimental", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-03-07T19:09:59Z" }, "spec": { @@ -1704,27 +1604,10 @@ "hideFromDocs": true } }, - { - "metadata": { - "name": "jaegerBackendMigration", - "resourceVersion": "1751465665226", - "creationTimestamp": "2024-11-15T14:40:20Z", - "deletionTimestamp": "2025-07-07T14:12:35Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-07-02 14:14:25.226989 +0000 UTC" - } - }, - "spec": { - "description": "Enables querying the Jaeger data source without the proxy", - "stage": "GA", - "codeowner": "@grafana/oss-big-tent", - "expression": "true" - } - }, { "metadata": { "name": "jitterAlertRulesWithinGroups", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-01-18T18:48:11Z" }, "spec": { @@ -1738,7 +1621,7 @@ { "metadata": { "name": "k8SFolderCounts", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-12-27T17:10:44Z" }, "spec": { @@ -1751,7 +1634,7 @@ { "metadata": { "name": "k8SFolderMove", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-12-27T17:10:44Z" }, "spec": { @@ -1764,7 +1647,7 @@ { "metadata": { "name": "kubernetesAggregator", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-02-12T20:59:35Z" }, "spec": { @@ -1777,7 +1660,7 @@ { "metadata": { "name": "kubernetesAggregatorCapTokenAuth", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-05-15T18:14:23Z" }, "spec": { @@ -1790,7 +1673,7 @@ { "metadata": { "name": "kubernetesAuthzApis", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-06-18T07:43:01Z" }, "spec": { @@ -1804,7 +1687,7 @@ { "metadata": { "name": "kubernetesClientDashboardsFolders", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-02-18T23:11:26Z" }, "spec": { @@ -1817,7 +1700,7 @@ { "metadata": { "name": "kubernetesDashboards", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-06-05T14:34:23Z" }, "spec": { @@ -1830,7 +1713,7 @@ { "metadata": { "name": "kubernetesFeatureToggles", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-01-18T05:32:44Z" }, "spec": { @@ -1844,8 +1727,8 @@ { "metadata": { "name": "kubernetesLibraryPanelConnections", - "resourceVersion": "1753100797468", - "creationTimestamp": "2025-07-21T12:26:37Z" + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-07-23T15:38:49Z" }, "spec": { "description": "Routes library panel connections requests from /api to using search", @@ -1857,7 +1740,7 @@ { "metadata": { "name": "kubernetesLibraryPanels", - "resourceVersion": "1750714411267", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-06-25T22:21:56Z" }, "spec": { @@ -1870,7 +1753,7 @@ { "metadata": { "name": "kubernetesSnapshots", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-12-05T22:31:49Z" }, "spec": { @@ -1883,11 +1766,8 @@ { "metadata": { "name": "localeFormatPreference", - "resourceVersion": "1753261256848", - "creationTimestamp": "2025-03-31T13:59:07Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-07-23 09:00:56.848352786 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-03-31T13:59:07Z" }, "spec": { "description": "Specifies the locale so the correct format for numbers and dates can be shown", @@ -1898,7 +1778,7 @@ { "metadata": { "name": "localizationForPlugins", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-03-31T04:38:38Z" }, "spec": { @@ -1910,7 +1790,7 @@ { "metadata": { "name": "logQLScope", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-11-11T11:53:24Z" }, "spec": { @@ -1925,7 +1805,7 @@ { "metadata": { "name": "logRequestsInstrumentedAsUnknown", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2022-06-10T08:56:55Z" }, "spec": { @@ -1937,7 +1817,7 @@ { "metadata": { "name": "logRowsPopoverMenu", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-11-16T09:48:10Z" }, "spec": { @@ -1951,7 +1831,7 @@ { "metadata": { "name": "logsContextDatasourceUi", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-01-27T14:12:01Z" }, "spec": { @@ -1966,7 +1846,7 @@ { "metadata": { "name": "logsExploreTableDefaultVisualization", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-05-02T15:28:15Z" }, "spec": { @@ -1979,7 +1859,7 @@ { "metadata": { "name": "logsExploreTableVisualisation", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-07-12T13:52:42Z" }, "spec": { @@ -1993,7 +1873,7 @@ { "metadata": { "name": "logsInfiniteScrolling", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-11-09T10:54:03Z" }, "spec": { @@ -2007,7 +1887,7 @@ { "metadata": { "name": "logsPanelControls", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-04-07T14:38:55Z" }, "spec": { @@ -2021,7 +1901,7 @@ { "metadata": { "name": "lokiExperimentalStreaming", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-06-19T10:03:51Z" }, "spec": { @@ -2033,7 +1913,7 @@ { "metadata": { "name": "lokiLabelNamesQueryApi", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-12-13T14:31:41Z" }, "spec": { @@ -2046,7 +1926,7 @@ { "metadata": { "name": "lokiLogsDataplane", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-07-13T07:58:00Z" }, "spec": { @@ -2055,39 +1935,10 @@ "codeowner": "@grafana/observability-logs" } }, - { - "metadata": { - "name": "lokiPredefinedOperations", - "resourceVersion": "1750434297879", - "creationTimestamp": "2023-06-02T10:52:36Z", - "deletionTimestamp": "2025-06-27T08:08:44Z" - }, - "spec": { - "description": "Adds predefined query operations to Loki query editor", - "stage": "experimental", - "codeowner": "@grafana/observability-logs", - "frontend": true - } - }, - { - "metadata": { - "name": "lokiQueryHints", - "resourceVersion": "1743693517832", - "creationTimestamp": "2023-12-18T20:43:16Z", - "deletionTimestamp": "2025-06-12T12:14:47Z" - }, - "spec": { - "description": "Enables query hints for Loki", - "stage": "GA", - "codeowner": "@grafana/observability-logs", - "frontend": true, - "expression": "true" - } - }, { "metadata": { "name": "lokiQuerySplitting", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-02-09T17:27:02Z" }, "spec": { @@ -2099,24 +1950,10 @@ "expression": "true" } }, - { - "metadata": { - "name": "lokiQuerySplittingConfig", - "resourceVersion": "1750434297879", - "creationTimestamp": "2023-03-20T15:51:36Z", - "deletionTimestamp": "2025-06-27T09:32:43Z" - }, - "spec": { - "description": "Give users the option to configure split durations for Loki queries", - "stage": "experimental", - "codeowner": "@grafana/observability-logs", - "frontend": true - } - }, { "metadata": { "name": "lokiRunQueriesInParallel", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-09-19T09:34:01Z" }, "spec": { @@ -2128,7 +1965,7 @@ { "metadata": { "name": "lokiShardSplitting", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-10-23T11:21:03Z" }, "spec": { @@ -2138,24 +1975,10 @@ "frontend": true } }, - { - "metadata": { - "name": "lokiStructuredMetadata", - "resourceVersion": "1750434297879", - "creationTimestamp": "2023-11-16T16:06:14Z", - "deletionTimestamp": "2025-06-27T09:00:53Z" - }, - "spec": { - "description": "Enables the loki data source to request structured metadata from the Loki server", - "stage": "GA", - "codeowner": "@grafana/observability-logs", - "expression": "true" - } - }, { "metadata": { "name": "managedDualWriter", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-02-19T14:50:39Z" }, "spec": { @@ -2169,7 +1992,7 @@ { "metadata": { "name": "metricsFromProfiles", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-04-09T10:55:28Z" }, "spec": { @@ -2182,7 +2005,7 @@ { "metadata": { "name": "mlExpressions", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-07-13T17:37:50Z" }, "spec": { @@ -2194,7 +2017,7 @@ { "metadata": { "name": "multiTenantFrontend", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-04-25T09:24:25Z" }, "spec": { @@ -2206,11 +2029,8 @@ { "metadata": { "name": "multiTenantTempCredentials", - "resourceVersion": "1752523189825", - "creationTimestamp": "2025-04-02T20:25:50Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-07-14 19:59:49.825959 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-04-02T20:25:50Z" }, "spec": { "description": "use multi-tenant path for awsTempCredentials", @@ -2222,7 +2042,7 @@ { "metadata": { "name": "mysqlAnsiQuotes", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2022-10-12T11:43:35Z" }, "spec": { @@ -2231,24 +2051,10 @@ "codeowner": "@grafana/search-and-storage" } }, - { - "metadata": { - "name": "nanoGit", - "resourceVersion": "1750434297879", - "creationTimestamp": "2025-06-17T17:07:30Z", - "deletionTimestamp": "2025-07-09T11:53:17Z" - }, - "spec": { - "description": "Use experimental git library for provisioning", - "stage": "experimental", - "codeowner": "@grafana/grafana-app-platform-squad", - "requiresRestart": true - } - }, { "metadata": { "name": "nestedFolders", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2022-10-26T14:15:14Z" }, "spec": { @@ -2261,7 +2067,7 @@ { "metadata": { "name": "newDashboardSharingComponent", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-05-03T15:02:18Z" }, "spec": { @@ -2275,7 +2081,7 @@ { "metadata": { "name": "newDashboardWithFiltersAndGroupBy", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-04-04T11:25:21Z" }, "spec": { @@ -2289,7 +2095,7 @@ { "metadata": { "name": "newFiltersUI", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-08-30T12:48:13Z" }, "spec": { @@ -2302,11 +2108,8 @@ { "metadata": { "name": "newInfluxDSConfigPageDesign", - "resourceVersion": "1750787021637", - "creationTimestamp": "2025-06-25T16:39:54Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-06-24 17:43:41.637607 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-06-25T16:39:54Z" }, "spec": { "description": "Enables new design for the InfluxDB data source configuration page", @@ -2318,7 +2121,7 @@ { "metadata": { "name": "newLogsPanel", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-02-04T17:40:17Z" }, "spec": { @@ -2331,11 +2134,8 @@ { "metadata": { "name": "newPDFRendering", - "resourceVersion": "1750821734038", - "creationTimestamp": "2024-02-08T12:09:34Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-06-25 03:22:14.038814 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2024-02-08T12:09:34Z" }, "spec": { "description": "New implementation for the dashboard-to-PDF rendering", @@ -2347,11 +2147,8 @@ { "metadata": { "name": "newShareReportDrawer", - "resourceVersion": "1750821734038", - "creationTimestamp": "2025-02-17T19:05:46Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-06-25 03:22:14.038814 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-02-17T19:05:46Z" }, "spec": { "description": "Enables the report creation drawer in a dashboard", @@ -2364,7 +2161,7 @@ { "metadata": { "name": "oauthRequireSubClaim", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-03-25T13:22:24Z" }, "spec": { @@ -2378,7 +2175,7 @@ { "metadata": { "name": "onPremToCloudMigrations", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-01-22T16:09:08Z" }, "spec": { @@ -2391,8 +2188,8 @@ { "metadata": { "name": "otelLogsFormatting", - "resourceVersion": "1750152612973", - "creationTimestamp": "2025-06-17T09:30:12Z" + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-07-23T15:38:49Z" }, "spec": { "description": "Applies OTel formatting templates to displayed logs", @@ -2404,7 +2201,7 @@ { "metadata": { "name": "panelFilterVariable", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-11-03T12:15:54Z" }, "spec": { @@ -2418,7 +2215,7 @@ { "metadata": { "name": "panelMonitoring", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-10-09T05:19:08Z" }, "spec": { @@ -2432,7 +2229,7 @@ { "metadata": { "name": "panelTitleSearch", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2022-02-15T18:26:03Z" }, "spec": { @@ -2445,7 +2242,7 @@ { "metadata": { "name": "passwordlessMagicLinkAuthentication", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-11-14T13:50:55Z" }, "spec": { @@ -2459,11 +2256,8 @@ { "metadata": { "name": "pdfTables", - "resourceVersion": "1750821734038", - "creationTimestamp": "2023-11-06T13:39:22Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-06-25 03:22:14.038814 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2023-11-06T13:39:22Z" }, "spec": { "description": "Enables generating table data as PDF in reporting", @@ -2474,7 +2268,7 @@ { "metadata": { "name": "permissionsFilterRemoveSubquery", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-08-02T07:39:25Z" }, "spec": { @@ -2486,7 +2280,7 @@ { "metadata": { "name": "pinNavItems", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-06-10T11:40:03Z" }, "spec": { @@ -2499,7 +2293,7 @@ { "metadata": { "name": "playlistsReconciler", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-12-20T03:09:31Z" }, "spec": { @@ -2512,8 +2306,8 @@ { "metadata": { "name": "pluginAssetProvider", - "resourceVersion": "1752486584712", - "creationTimestamp": "2025-07-14T09:49:44Z" + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-07-23T15:38:49Z" }, "spec": { "description": "Allows decoupled core plugins to load from the Grafana CDN", @@ -2525,27 +2319,10 @@ "expression": "false" } }, - { - "metadata": { - "name": "pluginLoadingRefactor", - "resourceVersion": "1752218524617", - "creationTimestamp": "2025-07-11T07:22:04Z", - "deletionTimestamp": "2025-07-11T07:23:34Z" - }, - "spec": { - "description": "Set this to true to use the new plugin loading functionality", - "stage": "experimental", - "codeowner": "@grafana/plugins-platform-backend", - "frontend": true, - "hideFromAdminPage": true, - "hideFromDocs": true, - "expression": "false" - } - }, { "metadata": { "name": "pluginProxyPreserveTrailingSlash", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-06-05T11:36:14Z" }, "spec": { @@ -2558,7 +2335,7 @@ { "metadata": { "name": "pluginsAutoUpdate", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-04-16T11:44:39Z" }, "spec": { @@ -2567,23 +2344,10 @@ "codeowner": "@grafana/plugins-platform-backend" } }, - { - "metadata": { - "name": "pluginsCDNSyncLoader", - "resourceVersion": "1750434297879", - "creationTimestamp": "2025-02-07T10:07:08Z", - "deletionTimestamp": "2025-07-21T10:13:07Z" - }, - "spec": { - "description": "Loads plugins from CDN synchronously", - "stage": "experimental", - "codeowner": "@grafana/plugins-platform-backend" - } - }, { "metadata": { "name": "pluginsDetailsRightPanel", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-08-13T09:55:30Z" }, "spec": { @@ -2597,7 +2361,7 @@ { "metadata": { "name": "pluginsFrontendSandbox", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-06-05T08:51:36Z" }, "spec": { @@ -2609,7 +2373,7 @@ { "metadata": { "name": "pluginsSkipHostEnvVars", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-11-15T17:09:14Z" }, "spec": { @@ -2621,7 +2385,7 @@ { "metadata": { "name": "pluginsSriChecks", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-10-04T12:55:09Z" }, "spec": { @@ -2634,7 +2398,7 @@ { "metadata": { "name": "preferLibraryPanelTitle", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-06-17T11:21:21Z" }, "spec": { @@ -2647,7 +2411,7 @@ { "metadata": { "name": "preinstallAutoUpdate", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-11-07T12:14:25Z" }, "spec": { @@ -2660,7 +2424,7 @@ { "metadata": { "name": "preserveDashboardStateWhenNavigating", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-05-27T12:28:06Z" }, "spec": { @@ -2674,7 +2438,7 @@ { "metadata": { "name": "promQLScope", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-01-29T20:22:17Z" }, "spec": { @@ -2689,7 +2453,7 @@ { "metadata": { "name": "prometheusAzureOverrideAudience", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2022-05-30T15:43:32Z", "deletionTimestamp": "2023-07-16T21:30:14Z" }, @@ -2703,7 +2467,7 @@ { "metadata": { "name": "prometheusCodeModeMetricNamesSearch", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-04-04T20:38:23Z" }, "spec": { @@ -2716,7 +2480,7 @@ { "metadata": { "name": "prometheusSpecialCharsInLabelValues", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-12-18T21:31:08Z" }, "spec": { @@ -2729,7 +2493,7 @@ { "metadata": { "name": "provisioning", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-11-22T09:03:50Z" }, "spec": { @@ -2742,11 +2506,8 @@ { "metadata": { "name": "provisioningSecretsService", - "resourceVersion": "1752501981893", - "creationTimestamp": "2025-07-14T14:05:50Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-07-14 14:06:21.89322 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-07-23T15:38:49Z" }, "spec": { "description": "Experimental feature to use the secrets service for provisioning instead of the legacy secrets", @@ -2758,11 +2519,8 @@ { "metadata": { "name": "publicDashboardsEmailSharing", - "resourceVersion": "1750821734038", - "creationTimestamp": "2023-01-03T19:45:15Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-06-25 03:22:14.038814 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2023-01-03T19:45:15Z" }, "spec": { "description": "Enables public dashboard sharing to be restricted to only allowed emails", @@ -2775,11 +2533,8 @@ { "metadata": { "name": "publicDashboardsScene", - "resourceVersion": "1750821734038", - "creationTimestamp": "2024-03-22T14:48:21Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-06-25 03:22:14.038814 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2024-03-22T14:48:21Z" }, "spec": { "description": "Enables public dashboard rendering using scenes", @@ -2792,12 +2547,9 @@ { "metadata": { "name": "queryLibrary", - "resourceVersion": "1750876431546", + "resourceVersion": "1753285129398", "creationTimestamp": "2022-10-07T18:31:45Z", - "deletionTimestamp": "2023-03-20T16:00:14Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-06-25 18:33:51.546111 +0000 UTC" - } + "deletionTimestamp": "2023-03-20T16:00:14Z" }, "spec": { "description": "Enables Query Library feature in Explore", @@ -2808,7 +2560,7 @@ { "metadata": { "name": "queryService", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-04-19T09:26:21Z" }, "spec": { @@ -2821,7 +2573,7 @@ { "metadata": { "name": "queryServiceFromExplore", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-04-02T10:00:33Z" }, "spec": { @@ -2834,7 +2586,7 @@ { "metadata": { "name": "queryServiceFromUI", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-04-19T09:26:21Z" }, "spec": { @@ -2847,7 +2599,7 @@ { "metadata": { "name": "queryServiceRewrite", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-04-19T09:26:21Z" }, "spec": { @@ -2860,7 +2612,7 @@ { "metadata": { "name": "recordedQueriesMulti", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-06-14T12:34:22Z" }, "spec": { @@ -2873,7 +2625,7 @@ { "metadata": { "name": "refactorVariablesTimeRange", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-06-06T13:12:09Z" }, "spec": { @@ -2886,9 +2638,8 @@ { "metadata": { "name": "regressionTransformation", - "resourceVersion": "1750434297879", - "creationTimestamp": "2023-11-24T14:49:16Z", - "deletionTimestamp": "2025-07-01T13:24:02Z" + "resourceVersion": "1753285129398", + "creationTimestamp": "2023-11-24T14:49:16Z" }, "spec": { "description": "Enables regression analysis transformation", @@ -2900,7 +2651,7 @@ { "metadata": { "name": "reloadDashboardsOnParamsChange", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-10-25T12:56:54Z" }, "spec": { @@ -2914,11 +2665,8 @@ { "metadata": { "name": "renderAuthJWT", - "resourceVersion": "1750821734038", - "creationTimestamp": "2023-04-03T16:53:38Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-06-25 03:22:14.038814 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2023-04-03T16:53:38Z" }, "spec": { "description": "Uses JWT-based auth for rendering instead of relying on remote cache", @@ -2930,11 +2678,8 @@ { "metadata": { "name": "rendererDisableAppPluginsPreload", - "resourceVersion": "1750821734038", - "creationTimestamp": "2025-02-24T14:43:06Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-06-25 03:22:14.038814 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-02-24T14:43:06Z" }, "spec": { "description": "Disable pre-loading app plugins when the request is coming from the renderer", @@ -2948,11 +2693,8 @@ { "metadata": { "name": "reportingRetries", - "resourceVersion": "1750821734038", - "creationTimestamp": "2023-08-31T07:47:47Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-06-25 03:22:14.038814 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2023-08-31T07:47:47Z" }, "spec": { "description": "Enables rendering retries for the reporting feature", @@ -2964,7 +2706,7 @@ { "metadata": { "name": "restoreDashboards", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-05-23T14:35:54Z" }, "spec": { @@ -2978,7 +2720,7 @@ { "metadata": { "name": "rolePickerDrawer", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-09-26T12:51:38Z" }, "spec": { @@ -2990,7 +2732,7 @@ { "metadata": { "name": "scopeApi", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-11-27T07:58:25Z" }, "spec": { @@ -3004,7 +2746,7 @@ { "metadata": { "name": "scopeFilters", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-03-05T15:41:19Z" }, "spec": { @@ -3018,7 +2760,7 @@ { "metadata": { "name": "scopeSearchAllLevels", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-04-14T07:42:16Z" }, "spec": { @@ -3032,7 +2774,7 @@ { "metadata": { "name": "secretsManagementAppPlatform", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-03-19T09:25:14Z" }, "spec": { @@ -3044,8 +2786,8 @@ { "metadata": { "name": "sharingDashboardImage", - "resourceVersion": "1747090555040", - "creationTimestamp": "2025-05-12T22:55:55Z" + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-07-23T15:38:49Z" }, "spec": { "description": "Enables image sharing functionality for dashboards", @@ -3058,7 +2800,7 @@ { "metadata": { "name": "showDashboardValidationWarnings", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2022-10-14T13:51:05Z" }, "spec": { @@ -3070,11 +2812,8 @@ { "metadata": { "name": "skipTokenRotationIfRecent", - "resourceVersion": "1751872762065", - "creationTimestamp": "2025-06-03T06:59:40Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-07-07 07:19:22.065046 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-06-03T06:59:40Z" }, "spec": { "description": "Skip token rotation if it was already rotated less than 5 seconds ago", @@ -3088,7 +2827,7 @@ { "metadata": { "name": "sqlDatasourceDatabaseSelection", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-06-06T16:28:52Z" }, "spec": { @@ -3102,7 +2841,7 @@ { "metadata": { "name": "sqlExpressions", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-02-27T21:16:00Z" }, "spec": { @@ -3127,7 +2866,7 @@ { "metadata": { "name": "sseGroupByDatasource", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-09-07T20:02:07Z" }, "spec": { @@ -3136,25 +2875,10 @@ "codeowner": "@grafana/observability-metrics" } }, - { - "metadata": { - "name": "ssoSettingsApi", - "resourceVersion": "1750434297879", - "creationTimestamp": "2023-11-08T09:50:01Z", - "deletionTimestamp": "2025-07-02T14:16:57Z" - }, - "spec": { - "description": "Enables the SSO settings API and the OAuth configuration UIs in Grafana", - "stage": "GA", - "codeowner": "@grafana/identity-access-team", - "allowSelfServe": true, - "expression": "true" - } - }, { "metadata": { "name": "ssoSettingsLDAP", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-06-18T11:31:27Z" }, "spec": { @@ -3166,25 +2890,10 @@ "expression": "true" } }, - { - "metadata": { - "name": "ssoSettingsSAML", - "resourceVersion": "1750434297879", - "creationTimestamp": "2024-03-14T11:04:45Z", - "deletionTimestamp": "2025-07-15T09:43:39Z" - }, - "spec": { - "description": "Use the new SSO Settings API to configure the SAML connector", - "stage": "GA", - "codeowner": "@grafana/identity-access-team", - "allowSelfServe": true, - "expression": "true" - } - }, { "metadata": { "name": "storage", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2022-03-17T17:19:23Z" }, "spec": { @@ -3196,7 +2905,7 @@ { "metadata": { "name": "tableNextGen", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-03-26T03:57:57Z" }, "spec": { @@ -3209,7 +2918,7 @@ { "metadata": { "name": "tableSharedCrosshair", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-12-13T09:33:14Z" }, "spec": { @@ -3222,11 +2931,8 @@ { "metadata": { "name": "tabularNumbers", - "resourceVersion": "1752078306230", - "creationTimestamp": "2025-06-24T11:52:03Z", - "annotations": { - "grafana.app/updatedTimestamp": "2025-07-09 16:25:06.230922635 +0000 UTC" - } + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-06-24T11:52:03Z" }, "spec": { "description": "Use fixed-width numbers globally in the UI", @@ -3238,7 +2944,7 @@ { "metadata": { "name": "teamHttpHeadersMimir", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-01-13T10:42:47Z" }, "spec": { @@ -3252,7 +2958,7 @@ { "metadata": { "name": "teamHttpHeadersTempo", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-05-22T19:13:31Z" }, "spec": { @@ -3264,7 +2970,7 @@ { "metadata": { "name": "templateVariablesUsesCombobox", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-01-31T09:53:13Z" }, "spec": { @@ -3277,8 +2983,8 @@ { "metadata": { "name": "tempoAlerting", - "resourceVersion": "1750158458662", - "creationTimestamp": "2025-06-17T11:07:38Z" + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-07-23T15:38:49Z" }, "spec": { "description": "Enables creating alerts from Tempo data source", @@ -3287,10 +2993,23 @@ "frontend": true } }, + { + "metadata": { + "name": "timeComparison", + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-07-23T15:38:49Z" + }, + "spec": { + "description": "Enables time comparison option in supported panels", + "stage": "experimental", + "codeowner": "@grafana/dataviz-squad", + "frontend": true + } + }, { "metadata": { "name": "timeRangeProvider", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-10-22T10:52:33Z" }, "spec": { @@ -3302,7 +3021,7 @@ { "metadata": { "name": "tlsMemcached", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-05-09T19:12:08Z" }, "spec": { @@ -3315,7 +3034,7 @@ { "metadata": { "name": "transformationsRedesign", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-07-12T16:35:49Z" }, "spec": { @@ -3330,7 +3049,7 @@ { "metadata": { "name": "unifiedHistory", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-12-13T10:41:18Z" }, "spec": { @@ -3343,7 +3062,7 @@ { "metadata": { "name": "unifiedNavbars", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-04-09T12:51:22Z" }, "spec": { @@ -3357,7 +3076,7 @@ { "metadata": { "name": "unifiedRequestLog", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2023-03-31T13:38:09Z" }, "spec": { @@ -3371,7 +3090,7 @@ { "metadata": { "name": "unifiedStorageBigObjectsSupport", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-10-17T10:18:29Z" }, "spec": { @@ -3383,7 +3102,7 @@ { "metadata": { "name": "unifiedStorageGrpcConnectionPool", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-03-21T13:24:54Z" }, "spec": { @@ -3397,7 +3116,7 @@ { "metadata": { "name": "unifiedStorageHistoryPruner", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-03-17T10:36:38Z" }, "spec": { @@ -3412,7 +3131,7 @@ { "metadata": { "name": "unifiedStorageSearch", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-09-30T19:46:14Z" }, "spec": { @@ -3426,8 +3145,8 @@ { "metadata": { "name": "unifiedStorageSearchDualReaderEnabled", - "resourceVersion": "1752500336818", - "creationTimestamp": "2025-07-14T13:38:56Z" + "resourceVersion": "1753285129398", + "creationTimestamp": "2025-07-23T15:38:49Z" }, "spec": { "description": "Enable dual reader for unified storage search", @@ -3440,7 +3159,7 @@ { "metadata": { "name": "unifiedStorageSearchPermissionFiltering", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-01-22T11:38:37Z" }, "spec": { @@ -3455,7 +3174,7 @@ { "metadata": { "name": "unifiedStorageSearchSprinkles", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-12-18T17:00:54Z" }, "spec": { @@ -3469,7 +3188,7 @@ { "metadata": { "name": "unifiedStorageSearchUI", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-12-19T18:21:48Z" }, "spec": { @@ -3483,7 +3202,7 @@ { "metadata": { "name": "useScopesNavigationEndpoint", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2025-03-31T15:20:00Z" }, "spec": { @@ -3498,7 +3217,7 @@ { "metadata": { "name": "useSessionStorageForRedirection", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-09-23T09:31:23Z" }, "spec": { @@ -3511,7 +3230,7 @@ { "metadata": { "name": "zanzana", - "resourceVersion": "1750434297879", + "resourceVersion": "1753285129398", "creationTimestamp": "2024-06-19T13:59:47Z" }, "spec": { diff --git a/public/app/features/dashboard-scene/scene/CustomTimeRangeCompare.tsx b/public/app/features/dashboard-scene/scene/CustomTimeRangeCompare.tsx new file mode 100644 index 00000000000..0e0055a2e73 --- /dev/null +++ b/public/app/features/dashboard-scene/scene/CustomTimeRangeCompare.tsx @@ -0,0 +1,60 @@ +import { SceneTimeRangeCompare, SceneComponentProps, VizPanel, sceneGraph } from '@grafana/scenes'; +import { TimeCompareOptions } from '@grafana/schema'; + +function hasTimeCompare(options: unknown): options is TimeCompareOptions { + return options != null && typeof options === 'object' && 'timeCompare' in options; +} + +export class CustomTimeRangeCompare extends SceneTimeRangeCompare { + constructor(state: Partial = {}) { + super({ + ...state, + compareWith: undefined, + compareOptions: [], + hideCheckbox: true, + }); + + this.addActivationHandler(() => this._activationHandler()); + } + + private _activationHandler() { + // Subscribe to parent panel's options changes + const vizPanel = sceneGraph.getAncestor(this, VizPanel); + + this._subs.add( + vizPanel.subscribeToState((newState, prevState) => { + const newTimeCompareEnabled = hasTimeCompare(newState.options) && newState.options.timeCompare; + const prevTimeCompareEnabled = hasTimeCompare(prevState.options) && prevState.options.timeCompare; + + // Only act when transitioning from enabled to disabled + if (prevTimeCompareEnabled && !newTimeCompareEnabled) { + this._handleDisable(); + } + }) + ); + } + + private _handleDisable() { + // Only clear state if there's actually a comparison active + if (this.state.compareWith) { + this.setState({ + compareWith: undefined, + }); + } + } + + static Component = function CustomTimeRangeCompareRenderer({ model }: SceneComponentProps) { + // Get the parent VizPanel to check timeCompare option + const vizPanel = sceneGraph.getAncestor(model, VizPanel); + const { options } = vizPanel.useState(); + + // Check if timeCompare is enabled + const isTimeCompareEnabled = hasTimeCompare(options) && options.timeCompare; + + if (!isTimeCompareEnabled) { + return <>; + } + + return ; + }; +} diff --git a/public/app/features/dashboard-scene/serialization/layoutSerializers/utils.test.ts b/public/app/features/dashboard-scene/serialization/layoutSerializers/utils.test.ts index b5f9950b5f6..fce584cf4f7 100644 --- a/public/app/features/dashboard-scene/serialization/layoutSerializers/utils.test.ts +++ b/public/app/features/dashboard-scene/serialization/layoutSerializers/utils.test.ts @@ -1,6 +1,8 @@ -import { PanelQueryKind } from '@grafana/schema/dist/esm/schema/dashboard/v2alpha1/types.spec.gen'; +import { PanelQueryKind, PanelKind } from '@grafana/schema/dist/esm/schema/dashboard/v2alpha1/types.spec.gen'; -import { getRuntimePanelDataSource } from './utils'; +import { CustomTimeRangeCompare } from '../../scene/CustomTimeRangeCompare'; + +import { buildVizPanel, getRuntimePanelDataSource } from './utils'; // Mock the config needed for the function jest.mock('@grafana/runtime', () => ({ @@ -32,9 +34,81 @@ jest.mock('@grafana/runtime', () => ({ }, }, }, + featureToggles: { + timeComparison: false, + }, }, })); +// Mock only what's essential for header actions tests +jest.mock('../../scene/CustomTimeRangeCompare', () => ({ + CustomTimeRangeCompare: jest.fn(), +})); + +// Helper function to create a minimal panel for testing +const createTestPanel = (): PanelKind => ({ + kind: 'Panel', + spec: { + id: 1, + title: 'Test Panel', + description: '', + vizConfig: { + kind: 'timeseries', + spec: { + options: {}, + fieldConfig: { defaults: {}, overrides: [] }, + pluginVersion: '1.0.0', + }, + }, + data: { + kind: 'QueryGroup', + spec: { + queries: [], + queryOptions: {}, + transformations: [], + }, + }, + links: [], + }, +}); + +describe('buildVizPanel', () => { + describe('header actions', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should include CustomTimeRangeCompare in headerActions when timeComparison feature toggle is enabled', () => { + // Mock config with timeComparison enabled + const mockConfig = require('@grafana/runtime').config; + mockConfig.featureToggles.timeComparison = true; + + const panel = createTestPanel(); + const vizPanel = buildVizPanel(panel); + + expect(vizPanel.state.headerActions).toBeDefined(); + expect(vizPanel.state.headerActions).toHaveLength(1); + expect(CustomTimeRangeCompare).toHaveBeenCalledWith({ + key: 'time-compare', + compareWith: undefined, + compareOptions: [], + }); + }); + + it('should not include headerActions when timeComparison feature toggle is disabled', () => { + // Mock config with timeComparison disabled + const mockConfig = require('@grafana/runtime').config; + mockConfig.featureToggles.timeComparison = false; + + const panel = createTestPanel(); + const vizPanel = buildVizPanel(panel); + + expect(vizPanel.state.headerActions).toBeUndefined(); + expect(CustomTimeRangeCompare).not.toHaveBeenCalled(); + }); + }); +}); + describe('getRuntimePanelDataSource', () => { it('should return the datasource when it is specified in the query', () => { const query: PanelQueryKind = { diff --git a/public/app/features/dashboard-scene/serialization/layoutSerializers/utils.ts b/public/app/features/dashboard-scene/serialization/layoutSerializers/utils.ts index c8018a98be0..b3b3325ab21 100644 --- a/public/app/features/dashboard-scene/serialization/layoutSerializers/utils.ts +++ b/public/app/features/dashboard-scene/serialization/layoutSerializers/utils.ts @@ -25,6 +25,7 @@ import { MIXED_DATASOURCE_NAME } from 'app/plugins/datasource/mixed/MixedDataSou import { ConditionalRendering } from '../../conditional-rendering/ConditionalRendering'; import { ConditionalRenderingGroup } from '../../conditional-rendering/ConditionalRenderingGroup'; import { conditionalRenderingSerializerRegistry } from '../../conditional-rendering/serializers'; +import { CustomTimeRangeCompare } from '../../scene/CustomTimeRangeCompare'; import { DashboardDatasourceBehaviour } from '../../scene/DashboardDatasourceBehaviour'; import { DashboardScene } from '../../scene/DashboardScene'; import { LibraryPanelBehavior } from '../../scene/LibraryPanelBehavior'; @@ -73,6 +74,9 @@ export function buildVizPanel(panel: PanelKind, id?: number): VizPanel { $behaviors: [], extendPanelContext: setDashboardPanelContext, // _UNSAFE_customMigrationHandler: getAngularPanelMigrationHandler(panel), //FIXME: Angular Migration + headerActions: config.featureToggles.timeComparison + ? [new CustomTimeRangeCompare({ key: 'time-compare', compareWith: undefined, compareOptions: [] })] + : undefined, }; if (!config.publicDashboardAccessToken) { diff --git a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts index ef03bdd17ee..7e9302634cd 100644 --- a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts +++ b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts @@ -810,6 +810,41 @@ describe('transformSaveModelToScene', () => { expect((libPanelBehavior as LibraryPanelBehavior).state.name).toEqual(panel.libraryPanel.name); expect(gridItem.state.body.state.title).toEqual(panel.title); }); + + describe('header actions', () => { + beforeEach(() => { + jest.clearAllMocks(); + }); + + it('should include headerActions when timeComparison feature toggle is enabled', () => { + config.featureToggles.timeComparison = true; + + const panel = { + title: 'Test Panel', + type: 'timeseries', + gridPos: { x: 0, y: 0, w: 12, h: 8 }, + }; + + const { vizPanel } = buildGridItemForTest(panel); + + expect(vizPanel.state.headerActions).toBeDefined(); + expect(vizPanel.state.headerActions).toHaveLength(1); + }); + + it('should not include headerActions when timeComparison feature toggle is disabled', () => { + config.featureToggles.timeComparison = false; + + const panel = { + title: 'Test Panel', + type: 'timeseries', + gridPos: { x: 0, y: 0, w: 12, h: 8 }, + }; + + const { vizPanel } = buildGridItemForTest(panel); + + expect(vizPanel.state.headerActions).toBeUndefined(); + }); + }); }); describe('Convert to new rows', () => { diff --git a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts index 2936ccfcf49..37030a95b89 100644 --- a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts +++ b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts @@ -29,6 +29,7 @@ import { DashboardDTO, DashboardDataDTO } from 'app/types/dashboard'; import { addPanelsOnLoadBehavior } from '../addToDashboard/addPanelsOnLoadBehavior'; import { AlertStatesDataLayer } from '../scene/AlertStatesDataLayer'; +import { CustomTimeRangeCompare } from '../scene/CustomTimeRangeCompare'; import { DashboardAnnotationsDataLayer } from '../scene/DashboardAnnotationsDataLayer'; import { DashboardControls } from '../scene/DashboardControls'; import { DashboardDataLayerSet } from '../scene/DashboardDataLayerSet'; @@ -407,6 +408,9 @@ export function buildGridItemForPanel(panel: PanelModel): DashboardGridItem { $behaviors: [], extendPanelContext: setDashboardPanelContext, _UNSAFE_customMigrationHandler: getAngularPanelMigrationHandler(panel), + headerActions: config.featureToggles.timeComparison + ? [new CustomTimeRangeCompare({ key: 'time-compare', compareWith: undefined, compareOptions: [] })] + : undefined, }; if (panel.libraryPanel) { diff --git a/public/app/features/dashboard-scene/utils/utils.ts b/public/app/features/dashboard-scene/utils/utils.ts index 7a5c41a08cd..1ab2c72969a 100644 --- a/public/app/features/dashboard-scene/utils/utils.ts +++ b/public/app/features/dashboard-scene/utils/utils.ts @@ -17,6 +17,7 @@ import { Dashboard, Panel, RowPanel } from '@grafana/schema'; import { createLogger } from '@grafana/ui'; import { initialIntervalVariableModelState } from 'app/features/variables/interval/reducer'; +import { CustomTimeRangeCompare } from '../scene/CustomTimeRangeCompare'; import { DashboardDatasourceBehaviour } from '../scene/DashboardDatasourceBehaviour'; import { DashboardLayoutOrchestrator } from '../scene/DashboardLayoutOrchestrator'; import { DashboardScene, DashboardSceneState } from '../scene/DashboardScene'; @@ -343,6 +344,9 @@ export function getDefaultVizPanel(): VizPanel { menu: new VizPanelMenu({ $behaviors: [panelMenuBehavior], }), + headerActions: config.featureToggles.timeComparison + ? [new CustomTimeRangeCompare({ key: 'time-compare', compareWith: undefined, compareOptions: [] })] + : undefined, $data: new SceneDataTransformer({ $data: new SceneQueryRunner({ queries: [{ refId: 'A' }], diff --git a/public/app/plugins/panel/timeseries/module.tsx b/public/app/plugins/panel/timeseries/module.tsx index beccdf480d6..0c909935145 100644 --- a/public/app/plugins/panel/timeseries/module.tsx +++ b/public/app/plugins/panel/timeseries/module.tsx @@ -1,5 +1,6 @@ import { PanelPlugin } from '@grafana/data'; import { t } from '@grafana/i18n'; +import { config } from '@grafana/runtime'; import { commonOptionsBuilder } from '@grafana/ui'; import { optsWithHideZeros } from '@grafana/ui/internal'; @@ -17,6 +18,10 @@ export const plugin = new PanelPlugin(TimeSeriesPanel) commonOptionsBuilder.addTooltipOptions(builder, false, true, optsWithHideZeros); commonOptionsBuilder.addLegendOptions(builder); + if (config.featureToggles.timeComparison) { + commonOptionsBuilder.addTimeCompareOption(builder); + } + builder.addCustomEditor({ id: 'timezone', name: t('timeseries.name-time-zone', 'Time zone'), diff --git a/public/app/plugins/panel/timeseries/panelcfg.cue b/public/app/plugins/panel/timeseries/panelcfg.cue index 0d2f6decd67..71ac34bd897 100644 --- a/public/app/plugins/panel/timeseries/panelcfg.cue +++ b/public/app/plugins/panel/timeseries/panelcfg.cue @@ -25,6 +25,7 @@ composableKinds: PanelCfg: lineage: { Options: common.OptionsWithTimezones & { legend: common.VizLegendOptions tooltip: common.VizTooltipOptions + timeCompare?: common.TimeCompareOptions orientation?: common.VizOrientation } @cuetsy(kind="interface") diff --git a/public/app/plugins/panel/timeseries/panelcfg.gen.ts b/public/app/plugins/panel/timeseries/panelcfg.gen.ts index e5e4bce7e7b..95eb3a710f8 100644 --- a/public/app/plugins/panel/timeseries/panelcfg.gen.ts +++ b/public/app/plugins/panel/timeseries/panelcfg.gen.ts @@ -13,6 +13,7 @@ import * as common from '@grafana/schema'; export interface Options extends common.OptionsWithTimezones { legend: common.VizLegendOptions; orientation?: common.VizOrientation; + timeCompare?: common.TimeCompareOptions; tooltip: common.VizTooltipOptions; }