From ce910a7eb243d3a88fbec60b5b3212e4edb8ba63 Mon Sep 17 00:00:00 2001 From: Ryan McKinley Date: Fri, 9 Feb 2024 15:34:12 -0800 Subject: [PATCH] FeatureFlags: manage creation/modification times automatically (#82131) --- pkg/registry/apis/featuretoggle/features.go | 65 +- pkg/registry/apis/featuretoggle/register.go | 2 +- pkg/services/featuremgmt/models.go | 4 +- pkg/services/featuremgmt/registry.go | 175 +- pkg/services/featuremgmt/toggles_gen.csv | 316 +-- pkg/services/featuremgmt/toggles_gen.json | 2028 ++++++++++++++++++ pkg/services/featuremgmt/toggles_gen_test.go | 140 +- 7 files changed, 2336 insertions(+), 394 deletions(-) create mode 100644 pkg/services/featuremgmt/toggles_gen.json diff --git a/pkg/registry/apis/featuretoggle/features.go b/pkg/registry/apis/featuretoggle/features.go index 23808272b73..37d8352a0c3 100644 --- a/pkg/registry/apis/featuretoggle/features.go +++ b/pkg/registry/apis/featuretoggle/features.go @@ -3,7 +3,7 @@ package featuretoggle import ( "context" "fmt" - "time" + "sync" "k8s.io/apimachinery/pkg/apis/meta/internalversion" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -27,18 +27,16 @@ var ( type featuresStorage struct { resource *common.ResourceInfo tableConverter rest.TableConvertor - features []featuremgmt.FeatureFlag - startup int64 + features *v0alpha1.FeatureList + featuresOnce sync.Once } // NOTE! this does not depend on config or any system state! // In the future, the existence of features (and their properties) can be defined dynamically -func NewFeaturesStorage(features []featuremgmt.FeatureFlag) *featuresStorage { +func NewFeaturesStorage() *featuresStorage { resourceInfo := v0alpha1.FeatureResourceInfo return &featuresStorage{ - startup: time.Now().UnixMilli(), resource: &resourceInfo, - features: features, tableConverter: utils.NewTableConverter( resourceInfo.GroupResource(), []metav1.TableColumnDefinition{ @@ -82,44 +80,35 @@ func (s *featuresStorage) ConvertToTable(ctx context.Context, object runtime.Obj return s.tableConverter.ConvertToTable(ctx, object, tableOptions) } +func (s *featuresStorage) init() { + s.featuresOnce.Do(func() { + rv := "1" + features, _ := featuremgmt.GetEmbeddedFeatureList() + for _, feature := range features.Items { + if feature.ResourceVersion > rv { + rv = feature.ResourceVersion + } + } + features.ResourceVersion = rv + s.features = &features + }) +} + func (s *featuresStorage) List(ctx context.Context, options *internalversion.ListOptions) (runtime.Object, error) { - flags := &v0alpha1.FeatureList{ - ListMeta: metav1.ListMeta{ - ResourceVersion: fmt.Sprintf("%d", s.startup), - }, + s.init() + if s.features == nil { + return nil, fmt.Errorf("error loading embedded features") } - for _, flag := range s.features { - flags.Items = append(flags.Items, toK8sForm(flag)) - } - return flags, nil + return s.features, nil } func (s *featuresStorage) Get(ctx context.Context, name string, options *metav1.GetOptions) (runtime.Object, error) { - for _, flag := range s.features { - if name == flag.Name { - obj := toK8sForm(flag) - return &obj, nil + s.init() + + for idx, flag := range s.features.Items { + if flag.Name == name { + return &s.features.Items[idx], nil } } return nil, fmt.Errorf("not found") } - -func toK8sForm(flag featuremgmt.FeatureFlag) v0alpha1.Feature { - return v0alpha1.Feature{ - ObjectMeta: metav1.ObjectMeta{ - Name: flag.Name, - CreationTimestamp: metav1.NewTime(flag.Created), - }, - Spec: v0alpha1.FeatureSpec{ - Description: flag.Description, - Stage: flag.Stage.String(), - Owner: string(flag.Owner), - AllowSelfServe: flag.AllowSelfServe, - HideFromAdminPage: flag.HideFromAdminPage, - HideFromDocs: flag.HideFromDocs, - FrontendOnly: flag.FrontendOnly, - RequiresDevMode: flag.RequiresDevMode, - RequiresRestart: flag.RequiresRestart, - }, - } -} diff --git a/pkg/registry/apis/featuretoggle/register.go b/pkg/registry/apis/featuretoggle/register.go index f04eb82bbec..205f3a25e0a 100644 --- a/pkg/registry/apis/featuretoggle/register.go +++ b/pkg/registry/apis/featuretoggle/register.go @@ -86,7 +86,7 @@ func (b *FeatureFlagAPIBuilder) GetAPIGroupInfo( ) (*genericapiserver.APIGroupInfo, error) { apiGroupInfo := genericapiserver.NewDefaultAPIGroupInfo(v0alpha1.GROUP, scheme, metav1.ParameterCodec, codecs) - featureStore := NewFeaturesStorage(b.features.GetFlags()) + featureStore := NewFeaturesStorage() toggleStore := NewTogglesStorage(b.features) storage := map[string]rest.Storage{} diff --git a/pkg/services/featuremgmt/models.go b/pkg/services/featuremgmt/models.go index cb22273ec35..6260547585b 100644 --- a/pkg/services/featuremgmt/models.go +++ b/pkg/services/featuremgmt/models.go @@ -4,7 +4,6 @@ import ( "bytes" "context" "encoding/json" - "time" ) type FeatureToggles interface { @@ -115,8 +114,7 @@ type FeatureFlag struct { Name string `json:"name" yaml:"name"` // Unique name Description string `json:"description"` Stage FeatureFlagStage `json:"stage,omitempty"` - Created time.Time `json:"created,omitempty"` // when the flag was introduced - Owner codeowner `json:"-"` // Owner person or team that owns this feature flag + Owner codeowner `json:"-"` // Owner person or team that owns this feature flag // Recommended properties - control behavior of the feature toggle management page in the UI AllowSelfServe bool `json:"allowSelfServe,omitempty"` // allow users with the right privileges to toggle this from the UI (GeneralAvailability, PublicPreview, and Deprecated toggles only) diff --git a/pkg/services/featuremgmt/registry.go b/pkg/services/featuremgmt/registry.go index 56db4acd0dd..6d13d0bf0a0 100644 --- a/pkg/services/featuremgmt/registry.go +++ b/pkg/services/featuremgmt/registry.go @@ -7,7 +7,10 @@ package featuremgmt import ( - "time" + "embed" + "encoding/json" + + featuretoggle "github.com/grafana/grafana/pkg/apis/featuretoggle/v0alpha1" ) var ( @@ -20,7 +23,6 @@ var ( Owner: grafanaAsCodeSquad, HideFromAdminPage: true, AllowSelfServe: false, - Created: time.Date(2022, time.May, 24, 12, 0, 0, 0, time.UTC), }, { Name: "live-service-web-worker", @@ -28,7 +30,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaAppPlatformSquad, - Created: time.Date(2021, time.November, 9, 12, 0, 0, 0, time.UTC), }, { Name: "queryOverLive", @@ -36,7 +37,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaAppPlatformSquad, - Created: time.Date(2022, time.January, 5, 12, 0, 0, 0, time.UTC), }, { Name: "panelTitleSearch", @@ -44,7 +44,6 @@ var ( Stage: FeatureStagePublicPreview, Owner: grafanaAppPlatformSquad, HideFromAdminPage: true, - Created: time.Date(2022, time.February, 15, 12, 0, 0, 0, time.UTC), }, { Name: "publicDashboards", @@ -53,7 +52,6 @@ var ( Owner: grafanaSharingSquad, Expression: "true", // enabled by default AllowSelfServe: true, - Created: time.Date(2022, time.April, 7, 12, 0, 0, 0, time.UTC), }, { Name: "publicDashboardsEmailSharing", @@ -62,14 +60,12 @@ var ( Owner: grafanaSharingSquad, HideFromDocs: true, HideFromAdminPage: true, - Created: time.Date(2022, time.December, 21, 12, 0, 0, 0, time.UTC), }, { Name: "lokiExperimentalStreaming", Description: "Support new streaming approach for loki (prototype, needs special loki build)", Stage: FeatureStageExperimental, Owner: grafanaObservabilityLogsSquad, - Created: time.Date(2023, time.June, 19, 12, 0, 0, 0, time.UTC), }, { Name: "featureHighlights", @@ -77,21 +73,18 @@ var ( Stage: FeatureStageGeneralAvailability, Owner: grafanaAsCodeSquad, AllowSelfServe: true, - Created: time.Date(2022, time.February, 3, 12, 0, 0, 0, time.UTC), }, { Name: "migrationLocking", Description: "Lock database during migrations", Stage: FeatureStagePublicPreview, Owner: grafanaBackendPlatformSquad, - Created: time.Date(2022, time.February, 15, 12, 0, 0, 0, time.UTC), }, { Name: "storage", Description: "Configurable storage for dashboards, datasources, and resources", Stage: FeatureStageExperimental, Owner: grafanaAppPlatformSquad, - Created: time.Date(2022, time.March, 17, 12, 0, 0, 0, time.UTC), }, { Name: "correlations", @@ -99,7 +92,6 @@ var ( Stage: FeatureStageGeneralAvailability, Owner: grafanaExploreSquad, AllowSelfServe: true, - Created: time.Date(2022, time.September, 16, 12, 0, 0, 0, time.UTC), }, { Name: "exploreContentOutline", @@ -109,14 +101,12 @@ var ( Expression: "true", // enabled by default FrontendOnly: true, AllowSelfServe: true, - Created: time.Date(2023, time.November, 3, 12, 0, 0, 0, time.UTC), }, { Name: "datasourceQueryMultiStatus", Description: "Introduce HTTP 207 Multi Status for api/ds/query", Stage: FeatureStageExperimental, Owner: grafanaPluginsPlatformSquad, - Created: time.Date(2022, time.May, 3, 12, 0, 0, 0, time.UTC), }, { Name: "traceToMetrics", @@ -124,7 +114,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaObservabilityTracesAndProfilingSquad, - Created: time.Date(2022, time.March, 7, 12, 0, 0, 0, time.UTC), }, { Name: "autoMigrateOldPanels", @@ -132,7 +121,6 @@ var ( Stage: FeatureStagePublicPreview, FrontendOnly: true, Owner: grafanaDatavizSquad, - Created: time.Date(2022, time.June, 11, 12, 0, 0, 0, time.UTC), }, { Name: "autoMigrateGraphPanel", @@ -140,7 +128,6 @@ var ( Stage: FeatureStagePublicPreview, FrontendOnly: true, Owner: grafanaDatavizSquad, - Created: time.Date(2023, time.December, 11, 7, 0, 0, 0, time.UTC), }, { Name: "disableAngular", @@ -149,7 +136,6 @@ var ( FrontendOnly: true, Owner: grafanaDatavizSquad, HideFromAdminPage: true, - Created: time.Date(2023, time.March, 23, 12, 0, 0, 0, time.UTC), }, { Name: "canvasPanelNesting", @@ -158,7 +144,6 @@ var ( FrontendOnly: true, Owner: grafanaDatavizSquad, HideFromAdminPage: true, - Created: time.Date(2022, time.May, 31, 12, 0, 0, 0, time.UTC), }, { Name: "newVizTooltips", @@ -167,7 +152,6 @@ var ( FrontendOnly: true, Owner: grafanaDatavizSquad, AllowSelfServe: false, - Created: time.Date(2023, time.November, 3, 12, 0, 0, 0, time.UTC), }, { Name: "scenes", @@ -175,7 +159,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaDashboardsSquad, - Created: time.Date(2022, time.July, 7, 12, 0, 0, 0, time.UTC), }, { Name: "disableSecretsCompatibility", @@ -183,14 +166,12 @@ var ( Stage: FeatureStageExperimental, RequiresRestart: true, Owner: hostedGrafanaTeam, - Created: time.Date(2022, time.July, 13, 12, 0, 0, 0, time.UTC), }, { Name: "logRequestsInstrumentedAsUnknown", Description: "Logs the path for requests that are instrumented as unknown", Stage: FeatureStageExperimental, Owner: hostedGrafanaTeam, - Created: time.Date(2022, time.June, 10, 12, 0, 0, 0, time.UTC), }, { Name: "dataConnectionsConsole", @@ -199,7 +180,6 @@ var ( Expression: "true", // turned on by default Owner: grafanaPluginsPlatformSquad, AllowSelfServe: true, - Created: time.Date(2022, time.June, 1, 12, 0, 0, 0, time.UTC), }, { // Some plugins rely on topnav feature flag being enabled, so we cannot remove this until we @@ -209,7 +189,6 @@ var ( Stage: FeatureStageDeprecated, Expression: "true", // enabled by default Owner: grafanaFrontendPlatformSquad, - Created: time.Date(2022, time.June, 20, 12, 0, 0, 0, time.UTC), }, { Name: "returnToPrevious", @@ -217,7 +196,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaFrontendPlatformSquad, - Created: time.Date(2024, time.January, 9, 11, 0, 0, 0, time.UTC), }, { Name: "grpcServer", @@ -225,7 +203,6 @@ var ( Stage: FeatureStagePublicPreview, Owner: grafanaAppPlatformSquad, HideFromAdminPage: true, - Created: time.Date(2022, time.September, 27, 12, 0, 0, 0, time.UTC), }, { Name: "unifiedStorage", @@ -234,7 +211,6 @@ var ( RequiresDevMode: true, RequiresRestart: true, // new SQL tables created Owner: grafanaAppPlatformSquad, - Created: time.Date(2022, time.December, 1, 12, 0, 0, 0, time.UTC), }, { Name: "cloudWatchCrossAccountQuerying", @@ -243,7 +219,6 @@ var ( Expression: "true", // enabled by default Owner: awsDatasourcesSquad, AllowSelfServe: true, - Created: time.Date(2022, time.November, 28, 12, 0, 0, 0, time.UTC), }, { Name: "redshiftAsyncQueryDataSupport", @@ -252,7 +227,6 @@ var ( Expression: "true", // enabled by default Owner: awsDatasourcesSquad, AllowSelfServe: false, - Created: time.Date(2022, time.August, 27, 12, 0, 0, 0, time.UTC), }, { Name: "athenaAsyncQueryDataSupport", @@ -262,21 +236,18 @@ var ( FrontendOnly: true, Owner: awsDatasourcesSquad, AllowSelfServe: false, - Created: time.Date(2022, time.August, 27, 12, 0, 0, 0, time.UTC), }, { Name: "showDashboardValidationWarnings", Description: "Show warnings when dashboards do not validate against the schema", Stage: FeatureStageExperimental, Owner: grafanaDashboardsSquad, - Created: time.Date(2022, time.October, 14, 12, 0, 0, 0, time.UTC), }, { Name: "mysqlAnsiQuotes", Description: "Use double quotes to escape keyword in a MySQL query", Stage: FeatureStageExperimental, Owner: grafanaBackendPlatformSquad, - Created: time.Date(2022, time.October, 12, 12, 0, 0, 0, time.UTC), }, { Name: "accessControlOnCall", @@ -284,14 +255,12 @@ var ( Stage: FeatureStagePublicPreview, Owner: identityAccessTeam, HideFromAdminPage: true, - Created: time.Date(2022, time.October, 19, 12, 0, 0, 0, time.UTC), }, { Name: "nestedFolders", Description: "Enable folder nesting", Stage: FeatureStagePublicPreview, Owner: grafanaBackendPlatformSquad, - Created: time.Date(2022, time.October, 22, 12, 0, 0, 0, time.UTC), }, { Name: "nestedFolderPicker", @@ -301,14 +270,12 @@ var ( FrontendOnly: true, Expression: "true", // enabled by default AllowSelfServe: true, - Created: time.Date(2023, time.July, 24, 12, 0, 0, 0, time.UTC), }, { Name: "alertingBacktesting", Description: "Rule backtesting API for alerting", Stage: FeatureStageExperimental, Owner: grafanaAlertingSquad, - Created: time.Date(2022, time.October, 20, 12, 0, 0, 0, time.UTC), }, { Name: "editPanelCSVDragAndDrop", @@ -316,7 +283,6 @@ var ( FrontendOnly: true, Stage: FeatureStageExperimental, Owner: grafanaBiSquad, - Created: time.Date(2022, time.December, 20, 12, 0, 0, 0, time.UTC), }, { Name: "alertingNoNormalState", @@ -325,7 +291,6 @@ var ( RequiresRestart: false, Owner: grafanaAlertingSquad, HideFromAdminPage: true, - Created: time.Date(2023, time.January, 14, 12, 0, 0, 0, time.UTC), }, { Name: "logsContextDatasourceUi", @@ -335,7 +300,6 @@ var ( Owner: grafanaObservabilityLogsSquad, Expression: "true", // turned on by default AllowSelfServe: true, - Created: time.Date(2023, time.January, 27, 12, 0, 0, 0, time.UTC), }, { Name: "lokiQuerySplitting", @@ -345,7 +309,6 @@ var ( Owner: grafanaObservabilityLogsSquad, Expression: "true", // turned on by default AllowSelfServe: true, - Created: time.Date(2023, time.February, 9, 12, 0, 0, 0, time.UTC), }, { Name: "lokiQuerySplittingConfig", @@ -353,14 +316,12 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaObservabilityLogsSquad, - Created: time.Date(2023, time.March, 20, 12, 0, 0, 0, time.UTC), }, { Name: "individualCookiePreferences", Description: "Support overriding cookie preferences per user", Stage: FeatureStageExperimental, Owner: grafanaBackendPlatformSquad, - Created: time.Date(2023, time.February, 23, 12, 0, 0, 0, time.UTC), }, { Name: "prometheusMetricEncyclopedia", @@ -370,7 +331,6 @@ var ( FrontendOnly: true, Owner: grafanaObservabilityMetricsSquad, AllowSelfServe: true, - Created: time.Date(2023, time.March, 7, 12, 0, 0, 0, time.UTC), }, { Name: "influxdbBackendMigration", @@ -380,14 +340,12 @@ var ( Owner: grafanaObservabilityMetricsSquad, Expression: "true", // enabled by default AllowSelfServe: false, - Created: time.Date(2023, time.March, 15, 12, 0, 0, 0, time.UTC), }, { Name: "influxqlStreamingParser", Description: "Enable streaming JSON parser for InfluxDB datasource InfluxQL query language", Stage: FeatureStageExperimental, Owner: grafanaObservabilityMetricsSquad, - Created: time.Date(2023, time.November, 29, 12, 0, 0, 0, time.UTC), }, { Name: "influxdbRunQueriesInParallel", @@ -395,7 +353,6 @@ var ( Stage: FeatureStagePrivatePreview, FrontendOnly: false, Owner: grafanaObservabilityMetricsSquad, - Created: time.Date(2024, time.January, 29, 12, 0, 0, 0, time.UTC), }, { Name: "clientTokenRotation", @@ -404,7 +361,6 @@ var ( Expression: "true", Owner: identityAccessTeam, AllowSelfServe: false, - Created: time.Date(2023, time.March, 23, 12, 0, 0, 0, time.UTC), }, { Name: "prometheusDataplane", @@ -413,7 +369,6 @@ var ( Stage: FeatureStageGeneralAvailability, Owner: grafanaObservabilityMetricsSquad, AllowSelfServe: true, - Created: time.Date(2023, time.March, 29, 12, 0, 0, 0, time.UTC), }, { Name: "lokiMetricDataplane", @@ -422,14 +377,12 @@ var ( Expression: "true", Owner: grafanaObservabilityLogsSquad, AllowSelfServe: true, - Created: time.Date(2023, time.April, 13, 12, 0, 0, 0, time.UTC), }, { Name: "lokiLogsDataplane", Description: "Changes logs responses from Loki to be compliant with the dataplane specification.", Stage: FeatureStageExperimental, Owner: grafanaObservabilityLogsSquad, - Created: time.Date(2023, time.July, 13, 12, 0, 0, 0, time.UTC), }, { Name: "dataplaneFrontendFallback", @@ -439,42 +392,36 @@ var ( Expression: "true", Owner: grafanaObservabilityMetricsSquad, AllowSelfServe: true, - Created: time.Date(2023, time.April, 24, 12, 0, 0, 0, time.UTC), }, { Name: "disableSSEDataplane", Description: "Disables dataplane specific processing in server side expressions.", Stage: FeatureStageExperimental, Owner: grafanaObservabilityMetricsSquad, - Created: time.Date(2023, time.April, 24, 12, 0, 0, 0, time.UTC), }, { Name: "alertStateHistoryLokiSecondary", Description: "Enable Grafana to write alert state history to an external Loki instance in addition to Grafana annotations.", Stage: FeatureStageExperimental, Owner: grafanaAlertingSquad, - Created: time.Date(2023, time.March, 30, 12, 0, 0, 0, time.UTC), }, { Name: "alertStateHistoryLokiPrimary", Description: "Enable a remote Loki instance as the primary source for state history reads.", Stage: FeatureStageExperimental, Owner: grafanaAlertingSquad, - Created: time.Date(2023, time.March, 30, 12, 0, 0, 0, time.UTC), }, { Name: "alertStateHistoryLokiOnly", Description: "Disable Grafana alerts from emitting annotations when a remote Loki instance is available.", Stage: FeatureStageExperimental, Owner: grafanaAlertingSquad, - Created: time.Date(2023, time.March, 30, 12, 0, 0, 0, time.UTC), }, { Name: "unifiedRequestLog", Description: "Writes error logs to the request logger", Stage: FeatureStageExperimental, Owner: grafanaBackendPlatformSquad, - Created: time.Date(2023, time.March, 31, 12, 0, 0, 0, time.UTC), }, { Name: "renderAuthJWT", @@ -482,7 +429,6 @@ var ( Stage: FeatureStagePublicPreview, Owner: grafanaAsCodeSquad, HideFromAdminPage: true, - Created: time.Date(2023, time.April, 3, 12, 0, 0, 0, time.UTC), }, { Name: "externalServiceAuth", @@ -490,7 +436,6 @@ var ( Stage: FeatureStageExperimental, RequiresDevMode: true, Owner: identityAccessTeam, - Created: time.Date(2023, time.April, 11, 12, 0, 0, 0, time.UTC), }, { Name: "refactorVariablesTimeRange", @@ -498,7 +443,6 @@ var ( Stage: FeatureStagePublicPreview, Owner: grafanaDashboardsSquad, HideFromAdminPage: true, // Non-feature, used to test out a bug fix that impacts the performance of template variables. - Created: time.Date(2023, time.June, 6, 12, 0, 0, 0, time.UTC), }, { Name: "enableElasticsearchBackendQuerying", @@ -507,7 +451,6 @@ var ( Owner: grafanaObservabilityLogsSquad, Expression: "true", // enabled by default AllowSelfServe: true, - Created: time.Date(2023, time.April, 14, 12, 0, 0, 0, time.UTC), }, { Name: "faroDatasourceSelector", @@ -515,7 +458,6 @@ var ( Stage: FeatureStagePublicPreview, FrontendOnly: true, Owner: appO11ySquad, - Created: time.Date(2023, time.May, 4, 12, 0, 0, 0, time.UTC), }, { Name: "enableDatagridEditing", @@ -523,7 +465,6 @@ var ( FrontendOnly: true, Stage: FeatureStagePublicPreview, Owner: grafanaBiSquad, - Created: time.Date(2023, time.April, 24, 12, 0, 0, 0, time.UTC), }, { Name: "extraThemes", @@ -531,7 +472,6 @@ var ( FrontendOnly: true, Stage: FeatureStageExperimental, Owner: grafanaFrontendPlatformSquad, - Created: time.Date(2023, time.May, 10, 12, 0, 0, 0, time.UTC), }, { Name: "lokiPredefinedOperations", @@ -539,7 +479,6 @@ var ( FrontendOnly: true, Stage: FeatureStageExperimental, Owner: grafanaObservabilityLogsSquad, - Created: time.Date(2023, time.June, 2, 12, 0, 0, 0, time.UTC), }, { Name: "pluginsFrontendSandbox", @@ -547,7 +486,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaPluginsPlatformSquad, - Created: time.Date(2023, time.June, 5, 12, 0, 0, 0, time.UTC), }, { Name: "dashboardEmbed", @@ -555,7 +493,6 @@ var ( FrontendOnly: true, Stage: FeatureStageExperimental, Owner: grafanaAsCodeSquad, - Created: time.Date(2023, time.July, 6, 12, 0, 0, 0, time.UTC), }, { Name: "frontendSandboxMonitorOnly", @@ -563,7 +500,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaPluginsPlatformSquad, - Created: time.Date(2023, time.July, 5, 12, 0, 0, 0, time.UTC), }, { Name: "sqlDatasourceDatabaseSelection", @@ -572,7 +508,6 @@ var ( Stage: FeatureStagePublicPreview, Owner: grafanaBiSquad, HideFromAdminPage: true, - Created: time.Date(2023, time.June, 6, 12, 0, 0, 0, time.UTC), }, { Name: "lokiFormatQuery", @@ -580,7 +515,6 @@ var ( FrontendOnly: true, Stage: FeatureStageExperimental, Owner: grafanaObservabilityLogsSquad, - Created: time.Date(2023, time.June, 21, 12, 0, 0, 0, time.UTC), }, { Name: "cloudWatchLogsMonacoEditor", @@ -590,7 +524,6 @@ var ( Expression: "true", // enabled by default Owner: awsDatasourcesSquad, AllowSelfServe: true, - Created: time.Date(2023, time.June, 12, 12, 0, 0, 0, time.UTC), }, { Name: "exploreScrollableLogsContainer", @@ -598,7 +531,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaObservabilityLogsSquad, - Created: time.Date(2023, time.June, 15, 12, 0, 0, 0, time.UTC), }, { Name: "recordedQueriesMulti", @@ -607,7 +539,6 @@ var ( Expression: "true", Owner: grafanaObservabilityMetricsSquad, AllowSelfServe: false, - Created: time.Date(2023, time.June, 14, 12, 0, 0, 0, time.UTC), }, { Name: "pluginsDynamicAngularDetectionPatterns", @@ -615,7 +546,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: false, Owner: grafanaPluginsPlatformSquad, - Created: time.Date(2023, time.June, 26, 12, 0, 0, 0, time.UTC), }, { Name: "vizAndWidgetSplit", @@ -623,7 +553,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaDashboardsSquad, - Created: time.Date(2023, time.June, 27, 12, 0, 0, 0, time.UTC), }, { Name: "prometheusIncrementalQueryInstrumentation", @@ -631,7 +560,6 @@ var ( FrontendOnly: true, Stage: FeatureStageExperimental, Owner: grafanaObservabilityMetricsSquad, - Created: time.Date(2023, time.July, 5, 12, 0, 0, 0, time.UTC), }, { Name: "logsExploreTableVisualisation", @@ -639,14 +567,12 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaObservabilityLogsSquad, - Created: time.Date(2023, time.July, 12, 12, 0, 0, 0, time.UTC), }, { Name: "awsDatasourcesTempCredentials", Description: "Support temporary security credentials in AWS plugins for Grafana Cloud customers", Stage: FeatureStageExperimental, Owner: awsDatasourcesSquad, - Created: time.Date(2023, time.July, 6, 12, 0, 0, 0, time.UTC), }, { Name: "transformationsRedesign", @@ -656,7 +582,6 @@ var ( Expression: "true", // enabled by default Owner: grafanaObservabilityMetricsSquad, AllowSelfServe: true, - Created: time.Date(2023, time.July, 12, 12, 0, 0, 0, time.UTC), }, { Name: "mlExpressions", @@ -664,7 +589,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: false, Owner: grafanaAlertingSquad, - Created: time.Date(2023, time.July, 13, 12, 0, 0, 0, time.UTC), }, { Name: "traceQLStreaming", @@ -672,7 +596,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaObservabilityTracesAndProfilingSquad, - Created: time.Date(2023, time.July, 26, 12, 0, 0, 0, time.UTC), }, { Name: "metricsSummary", @@ -680,7 +603,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaObservabilityTracesAndProfilingSquad, - Created: time.Date(2023, time.August, 28, 12, 0, 0, 0, time.UTC), }, { Name: "grafanaAPIServerWithExperimentalAPIs", @@ -689,7 +611,6 @@ var ( RequiresRestart: true, RequiresDevMode: true, Owner: grafanaAppPlatformSquad, - Created: time.Date(2023, time.October, 6, 12, 0, 0, 0, time.UTC), }, { Name: "grafanaAPIServerEnsureKubectlAccess", @@ -698,7 +619,6 @@ var ( RequiresDevMode: true, RequiresRestart: true, Owner: grafanaAppPlatformSquad, - Created: time.Date(2023, time.December, 6, 12, 0, 0, 0, time.UTC), }, { Name: "featureToggleAdminPage", @@ -707,7 +627,6 @@ var ( FrontendOnly: false, Owner: grafanaOperatorExperienceSquad, RequiresRestart: true, - Created: time.Date(2023, time.July, 18, 12, 0, 0, 0, time.UTC), }, { Name: "awsAsyncQueryCaching", @@ -715,7 +634,6 @@ var ( Stage: FeatureStageGeneralAvailability, Expression: "true", // enabled by default Owner: awsDatasourcesSquad, - Created: time.Date(2023, time.July, 21, 12, 0, 0, 0, time.UTC), }, { Name: "splitScopes", @@ -726,14 +644,12 @@ var ( Owner: identityAccessTeam, RequiresRestart: true, HideFromAdminPage: true, // This is internal work to speed up dashboard search, and is not ready for wider use - Created: time.Date(2023, time.July, 21, 12, 0, 0, 0, time.UTC), }, { Name: "permissionsFilterRemoveSubquery", Description: "Alternative permission filter implementation that does not use subqueries for fetching the dashboard folder", Stage: FeatureStageExperimental, Owner: grafanaBackendPlatformSquad, - Created: time.Date(2023, time.August, 2, 12, 0, 0, 0, time.UTC), }, { Name: "prometheusConfigOverhaulAuth", @@ -742,7 +658,6 @@ var ( Stage: FeatureStageGeneralAvailability, Expression: "true", // on by default AllowSelfServe: false, - Created: time.Date(2023, time.July, 21, 12, 0, 0, 0, time.UTC), }, { Name: "configurableSchedulerTick", @@ -752,7 +667,6 @@ var ( Owner: grafanaAlertingSquad, RequiresRestart: true, HideFromDocs: true, - Created: time.Date(2023, time.July, 26, 12, 0, 0, 0, time.UTC), }, { Name: "influxdbSqlSupport", @@ -763,7 +677,6 @@ var ( RequiresRestart: true, AllowSelfServe: true, Expression: "true", // enabled by default - Created: time.Date(2023, time.August, 2, 12, 0, 0, 0, time.UTC), }, { Name: "alertingNoDataErrorExecution", @@ -773,7 +686,6 @@ var ( Owner: grafanaAlertingSquad, RequiresRestart: true, Expression: "true", // enabled by default - Created: time.Date(2023, time.August, 15, 12, 0, 0, 0, time.UTC), }, { Name: "angularDeprecationUI", @@ -781,7 +693,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaPluginsPlatformSquad, - Created: time.Date(2023, time.August, 29, 12, 0, 0, 0, time.UTC), }, { Name: "dashgpt", @@ -789,7 +700,6 @@ var ( Stage: FeatureStagePublicPreview, FrontendOnly: true, Owner: grafanaDashboardsSquad, - Created: time.Date(2023, time.November, 17, 12, 0, 0, 0, time.UTC), }, { Name: "reportingRetries", @@ -798,14 +708,12 @@ var ( FrontendOnly: false, Owner: grafanaSharingSquad, RequiresRestart: true, - Created: time.Date(2023, time.August, 31, 12, 0, 0, 0, time.UTC), }, { Name: "sseGroupByDatasource", Description: "Send query to the same datasource in a single request when using server side expressions. The `cloudWatchBatchQueries` feature toggle should be enabled if this used with CloudWatch.", Stage: FeatureStageExperimental, Owner: grafanaObservabilityMetricsSquad, - Created: time.Date(2023, time.September, 7, 12, 0, 0, 0, time.UTC), }, { Name: "libraryPanelRBAC", @@ -814,7 +722,6 @@ var ( FrontendOnly: false, Owner: grafanaDashboardsSquad, RequiresRestart: true, - Created: time.Date(2023, time.October, 11, 12, 0, 0, 0, time.UTC), }, { Name: "lokiRunQueriesInParallel", @@ -822,7 +729,6 @@ var ( Stage: FeatureStagePrivatePreview, FrontendOnly: false, Owner: grafanaObservabilityLogsSquad, - Created: time.Date(2023, time.September, 19, 12, 0, 0, 0, time.UTC), }, { Name: "wargamesTesting", @@ -830,7 +736,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: false, Owner: hostedGrafanaTeam, - Created: time.Date(2023, time.September, 13, 12, 0, 0, 0, time.UTC), }, { Name: "alertingInsights", @@ -841,14 +746,12 @@ var ( Expression: "true", // enabled by default AllowSelfServe: false, HideFromAdminPage: true, // This is moving away from being a feature toggle. - Created: time.Date(2023, time.September, 14, 12, 0, 0, 0, time.UTC), }, { Name: "externalCorePlugins", Description: "Allow core plugins to be loaded as external", Stage: FeatureStageExperimental, Owner: grafanaPluginsPlatformSquad, - Created: time.Date(2023, time.September, 22, 12, 0, 0, 0, time.UTC), }, { Name: "pluginsAPIMetrics", @@ -856,14 +759,12 @@ var ( FrontendOnly: true, Stage: FeatureStageExperimental, Owner: grafanaPluginsPlatformSquad, - Created: time.Date(2023, time.September, 21, 12, 0, 0, 0, time.UTC), }, { Name: "idForwarding", Description: "Generate signed id token for identity that can be forwarded to plugins and external services", Stage: FeatureStageExperimental, Owner: identityAccessTeam, - Created: time.Date(2023, time.September, 25, 12, 0, 0, 0, time.UTC), }, { Name: "cloudWatchWildCardDimensionValues", @@ -872,7 +773,6 @@ var ( Expression: "true", // enabled by default Owner: awsDatasourcesSquad, AllowSelfServe: true, - Created: time.Date(2023, time.September, 27, 12, 0, 0, 0, time.UTC), }, { Name: "externalServiceAccounts", @@ -880,7 +780,6 @@ var ( HideFromAdminPage: true, Stage: FeatureStagePublicPreview, Owner: identityAccessTeam, - Created: time.Date(2023, time.September, 28, 12, 0, 0, 0, time.UTC), }, { Name: "panelMonitoring", @@ -888,7 +787,6 @@ var ( Stage: FeatureStageExperimental, Owner: grafanaDatavizSquad, FrontendOnly: true, - Created: time.Date(2023, time.October, 8, 12, 0, 0, 0, time.UTC), }, { Name: "enableNativeHTTPHistogram", @@ -896,7 +794,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: false, Owner: hostedGrafanaTeam, - Created: time.Date(2023, time.October, 3, 12, 0, 0, 0, time.UTC), }, { Name: "formatString", @@ -904,7 +801,6 @@ var ( Stage: FeatureStagePublicPreview, FrontendOnly: true, Owner: grafanaBiSquad, - Created: time.Date(2023, time.October, 13, 12, 0, 0, 0, time.UTC), }, { Name: "transformationsVariableSupport", @@ -912,7 +808,6 @@ var ( FrontendOnly: true, Stage: FeatureStagePublicPreview, Owner: grafanaBiSquad, - Created: time.Date(2023, time.October, 4, 12, 0, 0, 0, time.UTC), }, { Name: "kubernetesPlaylists", @@ -920,7 +815,6 @@ var ( Stage: FeatureStageExperimental, Owner: grafanaAppPlatformSquad, RequiresRestart: true, // changes the API routing - Created: time.Date(2023, time.November, 8, 12, 0, 0, 0, time.UTC), }, { Name: "kubernetesSnapshots", @@ -928,7 +822,6 @@ var ( Stage: FeatureStageExperimental, Owner: grafanaAppPlatformSquad, RequiresRestart: true, // changes the API routing - Created: time.Date(2023, time.December, 4, 12, 0, 0, 0, time.UTC), }, { Name: "kubernetesQueryServiceRewrite", @@ -937,14 +830,12 @@ var ( Owner: grafanaAppPlatformSquad, RequiresRestart: true, // changes the API routing RequiresDevMode: true, - Created: time.Date(2024, time.January, 28, 12, 0, 0, 0, time.UTC), }, { Name: "cloudWatchBatchQueries", Description: "Runs CloudWatch metrics queries as separate batches", Stage: FeatureStagePublicPreview, Owner: awsDatasourcesSquad, - Created: time.Date(2023, time.October, 20, 12, 0, 0, 0, time.UTC), }, { Name: "recoveryThreshold", @@ -953,7 +844,6 @@ var ( FrontendOnly: false, Owner: grafanaAlertingSquad, RequiresRestart: true, - Created: time.Date(2023, time.October, 10, 12, 0, 0, 0, time.UTC), Expression: "true", }, { @@ -962,7 +852,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: false, Owner: grafanaObservabilityLogsSquad, - Created: time.Date(2023, time.November, 16, 12, 0, 0, 0, time.UTC), }, { Name: "teamHttpHeaders", @@ -970,7 +859,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: false, Owner: identityAccessTeam, - Created: time.Date(2023, time.October, 17, 12, 0, 0, 0, time.UTC), }, { Name: "awsDatasourcesNewFormStyling", @@ -978,7 +866,6 @@ var ( Stage: FeatureStagePublicPreview, FrontendOnly: true, Owner: awsDatasourcesSquad, - Created: time.Date(2023, time.October, 12, 12, 0, 0, 0, time.UTC), }, { Name: "cachingOptimizeSerializationMemoryUsage", @@ -986,7 +873,6 @@ var ( Stage: FeatureStageExperimental, Owner: grafanaOperatorExperienceSquad, FrontendOnly: false, - Created: time.Date(2023, time.October, 12, 12, 0, 0, 0, time.UTC), }, { Name: "panelTitleSearchInV1", @@ -994,7 +880,6 @@ var ( RequiresDevMode: true, Stage: FeatureStageExperimental, Owner: grafanaBackendPlatformSquad, - Created: time.Date(2023, time.October, 13, 12, 0, 0, 0, time.UTC), }, { Name: "pluginsInstrumentationStatusSource", @@ -1002,7 +887,6 @@ var ( FrontendOnly: false, Stage: FeatureStageExperimental, Owner: grafanaPluginsPlatformSquad, - Created: time.Date(2023, time.October, 17, 12, 0, 0, 0, time.UTC), }, { Name: "managedPluginsInstall", @@ -1010,7 +894,6 @@ var ( Stage: FeatureStagePublicPreview, RequiresDevMode: false, Owner: grafanaPluginsPlatformSquad, - Created: time.Date(2023, time.October, 18, 12, 0, 0, 0, time.UTC), }, { Name: "prometheusPromQAIL", @@ -1018,7 +901,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaObservabilityMetricsSquad, - Created: time.Date(2023, time.October, 19, 12, 0, 0, 0, time.UTC), }, { Name: "addFieldFromCalculationStatFunctions", @@ -1026,28 +908,24 @@ var ( Stage: FeatureStagePublicPreview, FrontendOnly: true, Owner: grafanaBiSquad, - Created: time.Date(2023, time.November, 3, 12, 0, 0, 0, time.UTC), }, { Name: "alertmanagerRemoteSecondary", Description: "Enable Grafana to sync configuration and state with a remote Alertmanager.", Stage: FeatureStageExperimental, Owner: grafanaAlertingSquad, - Created: time.Date(2023, time.October, 30, 12, 0, 0, 0, time.UTC), }, { Name: "alertmanagerRemotePrimary", Description: "Enable Grafana to have a remote Alertmanager instance as the primary Alertmanager.", Stage: FeatureStageExperimental, Owner: grafanaAlertingSquad, - Created: time.Date(2023, time.October, 30, 12, 0, 0, 0, time.UTC), }, { Name: "alertmanagerRemoteOnly", Description: "Disable the internal Alertmanager and only use the external one defined.", Stage: FeatureStageExperimental, Owner: grafanaAlertingSquad, - Created: time.Date(2023, time.October, 30, 12, 0, 0, 0, time.UTC), }, { Name: "annotationPermissionUpdate", @@ -1055,7 +933,6 @@ var ( Stage: FeatureStageExperimental, RequiresDevMode: false, Owner: identityAccessTeam, - Created: time.Date(2023, time.October, 31, 12, 0, 0, 0, time.UTC), }, { Name: "extractFieldsNameDeduplication", @@ -1063,7 +940,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaBiSquad, - Created: time.Date(2023, time.November, 2, 12, 0, 0, 0, time.UTC), }, { Name: "dashboardSceneForViewers", @@ -1071,7 +947,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaDashboardsSquad, - Created: time.Date(2023, time.November, 2, 12, 0, 0, 0, time.UTC), }, { Name: "dashboardScene", @@ -1079,7 +954,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaDashboardsSquad, - Created: time.Date(2023, time.November, 13, 12, 0, 0, 0, time.UTC), }, { Name: "panelFilterVariable", @@ -1088,7 +962,6 @@ var ( FrontendOnly: true, Owner: grafanaDashboardsSquad, HideFromDocs: true, - Created: time.Date(2023, time.November, 3, 12, 0, 0, 0, time.UTC), }, { Name: "pdfTables", @@ -1096,7 +969,6 @@ var ( Stage: FeatureStagePublicPreview, FrontendOnly: false, Owner: grafanaSharingSquad, - Created: time.Date(2023, time.November, 6, 12, 0, 0, 0, time.UTC), }, { Name: "ssoSettingsApi", @@ -1104,7 +976,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: false, Owner: identityAccessTeam, - Created: time.Date(2023, time.November, 8, 12, 0, 0, 0, time.UTC), }, { Name: "canvasPanelPanZoom", @@ -1112,7 +983,6 @@ var ( Stage: FeatureStagePublicPreview, FrontendOnly: true, Owner: grafanaDatavizSquad, - Created: time.Date(2023, time.December, 27, 12, 0, 0, 0, time.UTC), }, { Name: "logsInfiniteScrolling", @@ -1120,7 +990,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaObservabilityLogsSquad, - Created: time.Date(2023, time.November, 9, 12, 0, 0, 0, time.UTC), }, { Name: "flameGraphItemCollapsing", @@ -1128,7 +997,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaObservabilityTracesAndProfilingSquad, - Created: time.Date(2023, time.November, 9, 12, 0, 0, 0, time.UTC), }, { Name: "alertingDetailsViewV2", @@ -1137,7 +1005,6 @@ var ( FrontendOnly: true, Owner: grafanaAlertingSquad, HideFromDocs: true, - Created: time.Date(2023, time.November, 9, 12, 0, 0, 0, time.UTC), }, { Name: "datatrails", @@ -1146,7 +1013,6 @@ var ( FrontendOnly: true, Owner: grafanaDashboardsSquad, HideFromDocs: true, - Created: time.Date(2023, time.November, 15, 12, 0, 0, 0, time.UTC), }, { Name: "alertingSimplifiedRouting", @@ -1155,7 +1021,6 @@ var ( FrontendOnly: false, Owner: grafanaAlertingSquad, HideFromDocs: true, - Created: time.Date(2023, time.November, 10, 12, 0, 0, 0, time.UTC), }, { Name: "logRowsPopoverMenu", @@ -1164,7 +1029,6 @@ var ( FrontendOnly: true, Expression: "true", Owner: grafanaObservabilityLogsSquad, - Created: time.Date(2023, time.November, 16, 12, 0, 0, 0, time.UTC), }, { Name: "pluginsSkipHostEnvVars", @@ -1172,7 +1036,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: false, Owner: grafanaPluginsPlatformSquad, - Created: time.Date(2023, time.November, 15, 12, 0, 0, 0, time.UTC), }, { Name: "tableSharedCrosshair", @@ -1180,7 +1043,6 @@ var ( FrontendOnly: true, Stage: FeatureStageExperimental, Owner: grafanaBiSquad, - Created: time.Date(2023, time.December, 12, 12, 0, 0, 0, time.UTC), }, { Name: "regressionTransformation", @@ -1188,7 +1050,6 @@ var ( Stage: FeatureStagePublicPreview, FrontendOnly: true, Owner: grafanaBiSquad, - Created: time.Date(2023, time.November, 24, 12, 0, 0, 0, time.UTC), }, { Name: "displayAnonymousStats", @@ -1196,7 +1057,6 @@ var ( Stage: FeatureStageGeneralAvailability, FrontendOnly: true, Owner: identityAccessTeam, - Created: time.Date(2023, time.November, 29, 12, 0, 0, 0, time.UTC), AllowSelfServe: false, Expression: "true", // enabled by default }, @@ -1209,7 +1069,6 @@ var ( Expression: "true", Owner: grafanaObservabilityLogsSquad, AllowSelfServe: false, - Created: time.Date(2023, time.December, 18, 12, 0, 0, 0, time.UTC), }, { Name: "kubernetesFeatureToggles", @@ -1218,7 +1077,6 @@ var ( FrontendOnly: true, Owner: grafanaOperatorExperienceSquad, AllowSelfServe: false, - Created: time.Date(2023, time.December, 22, 3, 43, 0, 0, time.UTC), HideFromAdminPage: true, }, { @@ -1228,7 +1086,6 @@ var ( Stage: FeatureStageGeneralAvailability, Owner: grafanaAlertingSquad, RequiresRestart: true, - Created: time.Date(2024, time.January, 3, 12, 0, 0, 0, time.UTC), Expression: "true", // enabled by default }, { @@ -1238,7 +1095,6 @@ var ( Stage: FeatureStageExperimental, Owner: grafanaPluginsPlatformSquad, RequiresRestart: true, - Created: time.Date(2024, time.January, 9, 12, 0, 0, 0, time.UTC), }, { Name: "cloudRBACRoles", @@ -1247,7 +1103,6 @@ var ( Owner: identityAccessTeam, HideFromDocs: true, RequiresRestart: true, - Created: time.Date(2024, time.January, 10, 12, 0, 0, 0, time.UTC), }, { Name: "alertingQueryOptimization", @@ -1255,7 +1110,6 @@ var ( Stage: FeatureStageGeneralAvailability, Owner: grafanaAlertingSquad, AllowSelfServe: false, - Created: time.Date(2024, time.January, 10, 12, 0, 0, 0, time.UTC), }, { Name: "newFolderPicker", @@ -1263,7 +1117,6 @@ var ( Stage: FeatureStageExperimental, Owner: grafanaFrontendPlatformSquad, FrontendOnly: true, - Created: time.Date(2024, time.January, 12, 12, 0, 0, 0, time.UTC), }, { Name: "jitterAlertRulesWithinGroups", @@ -1275,14 +1128,12 @@ var ( HideFromDocs: true, HideFromAdminPage: false, RequiresRestart: true, - Created: time.Date(2024, time.January, 17, 12, 0, 0, 0, time.UTC), }, { Name: "onPremToCloudMigrations", Description: "In-development feature that will allow users to easily migrate their on-prem Grafana instances to Grafana Cloud.", Stage: FeatureStageExperimental, Owner: grafanaOperatorExperienceSquad, - Created: time.Date(2024, time.January, 22, 3, 30, 00, 00, time.UTC), }, { Name: "alertingSaveStatePeriodic", @@ -1290,14 +1141,12 @@ var ( Stage: FeatureStagePrivatePreview, FrontendOnly: false, Owner: grafanaAlertingSquad, - Created: time.Date(2024, time.January, 22, 12, 0, 0, 0, time.UTC), }, { Name: "promQLScope", Description: "In-development feature that will allow injection of labels into prometheus queries.", Stage: FeatureStageExperimental, Owner: grafanaObservabilityMetricsSquad, - Created: time.Date(2024, time.January, 29, 0, 0, 0, 0, time.UTC), }, { Name: "nodeGraphDotLayout", @@ -1305,7 +1154,6 @@ var ( Stage: FeatureStageExperimental, FrontendOnly: true, Owner: grafanaObservabilityTracesAndProfilingSquad, - Created: time.Date(2024, time.January, 2, 12, 0, 0, 0, time.UTC), }, { Name: "groupToNestedTableTransformation", @@ -1313,14 +1161,25 @@ var ( Stage: FeatureStagePublicPreview, FrontendOnly: true, Owner: grafanaDatavizSquad, - Created: time.Date(2024, time.February, 5, 12, 0, 0, 0, time.UTC), }, { Name: "newPDFRendering", Description: "New implementation for the dashboard to PDF rendering", Stage: FeatureStageExperimental, Owner: grafanaSharingSquad, - Created: time.Date(2024, time.February, 8, 9, 51, 00, 00, time.UTC), }, } ) + +//go:embed toggles_gen.json +var f embed.FS + +// Get the cached feature list (exposed as a k8s resource) +func GetEmbeddedFeatureList() (featuretoggle.FeatureList, error) { + features := featuretoggle.FeatureList{} + body, err := f.ReadFile("toggles_gen.json") + if err == nil { + err = json.Unmarshal(body, &features) + } + return features, err +} diff --git a/pkg/services/featuremgmt/toggles_gen.csv b/pkg/services/featuremgmt/toggles_gen.csv index bcd896e222a..c88be17ca78 100644 --- a/pkg/services/featuremgmt/toggles_gen.csv +++ b/pkg/services/featuremgmt/toggles_gen.csv @@ -1,158 +1,158 @@ -Name,Stage,Owner,Created,requiresDevMode,RequiresRestart,FrontendOnly -disableEnvelopeEncryption,GA,@grafana/grafana-as-code,2022-05-24,false,false,false -live-service-web-worker,experimental,@grafana/grafana-app-platform-squad,2021-11-09,false,false,true -queryOverLive,experimental,@grafana/grafana-app-platform-squad,2022-01-05,false,false,true -panelTitleSearch,preview,@grafana/grafana-app-platform-squad,2022-02-15,false,false,false -publicDashboards,GA,@grafana/sharing-squad,2022-04-07,false,false,false -publicDashboardsEmailSharing,preview,@grafana/sharing-squad,2022-12-21,false,false,false -lokiExperimentalStreaming,experimental,@grafana/observability-logs,2023-06-19,false,false,false -featureHighlights,GA,@grafana/grafana-as-code,2022-02-03,false,false,false -migrationLocking,preview,@grafana/backend-platform,2022-02-15,false,false,false -storage,experimental,@grafana/grafana-app-platform-squad,2022-03-17,false,false,false -correlations,GA,@grafana/explore-squad,2022-09-16,false,false,false -exploreContentOutline,GA,@grafana/explore-squad,2023-11-03,false,false,true -datasourceQueryMultiStatus,experimental,@grafana/plugins-platform-backend,2022-05-03,false,false,false -traceToMetrics,experimental,@grafana/observability-traces-and-profiling,2022-03-07,false,false,true -autoMigrateOldPanels,preview,@grafana/dataviz-squad,2022-06-11,false,false,true -autoMigrateGraphPanel,preview,@grafana/dataviz-squad,2023-12-11,false,false,true -disableAngular,preview,@grafana/dataviz-squad,2023-03-23,false,false,true -canvasPanelNesting,experimental,@grafana/dataviz-squad,2022-05-31,false,false,true -newVizTooltips,preview,@grafana/dataviz-squad,2023-11-03,false,false,true -scenes,experimental,@grafana/dashboards-squad,2022-07-07,false,false,true -disableSecretsCompatibility,experimental,@grafana/hosted-grafana-team,2022-07-13,false,true,false -logRequestsInstrumentedAsUnknown,experimental,@grafana/hosted-grafana-team,2022-06-10,false,false,false -dataConnectionsConsole,GA,@grafana/plugins-platform-backend,2022-06-01,false,false,false -topnav,deprecated,@grafana/grafana-frontend-platform,2022-06-20,false,false,false -returnToPrevious,experimental,@grafana/grafana-frontend-platform,2024-01-09,false,false,true -grpcServer,preview,@grafana/grafana-app-platform-squad,2022-09-27,false,false,false -unifiedStorage,experimental,@grafana/grafana-app-platform-squad,2022-12-01,true,true,false -cloudWatchCrossAccountQuerying,GA,@grafana/aws-datasources,2022-11-28,false,false,false -redshiftAsyncQueryDataSupport,GA,@grafana/aws-datasources,2022-08-27,false,false,false -athenaAsyncQueryDataSupport,GA,@grafana/aws-datasources,2022-08-27,false,false,true -showDashboardValidationWarnings,experimental,@grafana/dashboards-squad,2022-10-14,false,false,false -mysqlAnsiQuotes,experimental,@grafana/backend-platform,2022-10-12,false,false,false -accessControlOnCall,preview,@grafana/identity-access-team,2022-10-19,false,false,false -nestedFolders,preview,@grafana/backend-platform,2022-10-22,false,false,false -nestedFolderPicker,GA,@grafana/grafana-frontend-platform,2023-07-24,false,false,true -alertingBacktesting,experimental,@grafana/alerting-squad,2022-10-20,false,false,false -editPanelCSVDragAndDrop,experimental,@grafana/grafana-bi-squad,2022-12-20,false,false,true -alertingNoNormalState,preview,@grafana/alerting-squad,2023-01-14,false,false,false -logsContextDatasourceUi,GA,@grafana/observability-logs,2023-01-27,false,false,true -lokiQuerySplitting,GA,@grafana/observability-logs,2023-02-09,false,false,true -lokiQuerySplittingConfig,experimental,@grafana/observability-logs,2023-03-20,false,false,true -individualCookiePreferences,experimental,@grafana/backend-platform,2023-02-23,false,false,false -prometheusMetricEncyclopedia,GA,@grafana/observability-metrics,2023-03-07,false,false,true -influxdbBackendMigration,GA,@grafana/observability-metrics,2023-03-15,false,false,true -influxqlStreamingParser,experimental,@grafana/observability-metrics,2023-11-29,false,false,false -influxdbRunQueriesInParallel,privatePreview,@grafana/observability-metrics,2024-01-29,false,false,false -clientTokenRotation,GA,@grafana/identity-access-team,2023-03-23,false,false,false -prometheusDataplane,GA,@grafana/observability-metrics,2023-03-29,false,false,false -lokiMetricDataplane,GA,@grafana/observability-logs,2023-04-13,false,false,false -lokiLogsDataplane,experimental,@grafana/observability-logs,2023-07-13,false,false,false -dataplaneFrontendFallback,GA,@grafana/observability-metrics,2023-04-24,false,false,true -disableSSEDataplane,experimental,@grafana/observability-metrics,2023-04-24,false,false,false -alertStateHistoryLokiSecondary,experimental,@grafana/alerting-squad,2023-03-30,false,false,false -alertStateHistoryLokiPrimary,experimental,@grafana/alerting-squad,2023-03-30,false,false,false -alertStateHistoryLokiOnly,experimental,@grafana/alerting-squad,2023-03-30,false,false,false -unifiedRequestLog,experimental,@grafana/backend-platform,2023-03-31,false,false,false -renderAuthJWT,preview,@grafana/grafana-as-code,2023-04-03,false,false,false -externalServiceAuth,experimental,@grafana/identity-access-team,2023-04-11,true,false,false -refactorVariablesTimeRange,preview,@grafana/dashboards-squad,2023-06-06,false,false,false -enableElasticsearchBackendQuerying,GA,@grafana/observability-logs,2023-04-14,false,false,false -faroDatasourceSelector,preview,@grafana/app-o11y,2023-05-04,false,false,true -enableDatagridEditing,preview,@grafana/grafana-bi-squad,2023-04-24,false,false,true -extraThemes,experimental,@grafana/grafana-frontend-platform,2023-05-10,false,false,true -lokiPredefinedOperations,experimental,@grafana/observability-logs,2023-06-02,false,false,true -pluginsFrontendSandbox,experimental,@grafana/plugins-platform-backend,2023-06-05,false,false,true -dashboardEmbed,experimental,@grafana/grafana-as-code,2023-07-06,false,false,true -frontendSandboxMonitorOnly,experimental,@grafana/plugins-platform-backend,2023-07-05,false,false,true -sqlDatasourceDatabaseSelection,preview,@grafana/grafana-bi-squad,2023-06-06,false,false,true -lokiFormatQuery,experimental,@grafana/observability-logs,2023-06-21,false,false,true -cloudWatchLogsMonacoEditor,GA,@grafana/aws-datasources,2023-06-12,false,false,true -exploreScrollableLogsContainer,experimental,@grafana/observability-logs,2023-06-15,false,false,true -recordedQueriesMulti,GA,@grafana/observability-metrics,2023-06-14,false,false,false -pluginsDynamicAngularDetectionPatterns,experimental,@grafana/plugins-platform-backend,2023-06-26,false,false,false -vizAndWidgetSplit,experimental,@grafana/dashboards-squad,2023-06-27,false,false,true -prometheusIncrementalQueryInstrumentation,experimental,@grafana/observability-metrics,2023-07-05,false,false,true -logsExploreTableVisualisation,experimental,@grafana/observability-logs,2023-07-12,false,false,true -awsDatasourcesTempCredentials,experimental,@grafana/aws-datasources,2023-07-06,false,false,false -transformationsRedesign,GA,@grafana/observability-metrics,2023-07-12,false,false,true -mlExpressions,experimental,@grafana/alerting-squad,2023-07-13,false,false,false -traceQLStreaming,experimental,@grafana/observability-traces-and-profiling,2023-07-26,false,false,true -metricsSummary,experimental,@grafana/observability-traces-and-profiling,2023-08-28,false,false,true -grafanaAPIServerWithExperimentalAPIs,experimental,@grafana/grafana-app-platform-squad,2023-10-06,true,true,false -grafanaAPIServerEnsureKubectlAccess,experimental,@grafana/grafana-app-platform-squad,2023-12-06,true,true,false -featureToggleAdminPage,experimental,@grafana/grafana-operator-experience-squad,2023-07-18,false,true,false -awsAsyncQueryCaching,GA,@grafana/aws-datasources,2023-07-21,false,false,false -splitScopes,deprecated,@grafana/identity-access-team,2023-07-21,false,true,false -permissionsFilterRemoveSubquery,experimental,@grafana/backend-platform,2023-08-02,false,false,false -prometheusConfigOverhaulAuth,GA,@grafana/observability-metrics,2023-07-21,false,false,false -configurableSchedulerTick,experimental,@grafana/alerting-squad,2023-07-26,false,true,false -influxdbSqlSupport,GA,@grafana/observability-metrics,2023-08-02,false,true,false -alertingNoDataErrorExecution,GA,@grafana/alerting-squad,2023-08-15,false,true,false -angularDeprecationUI,experimental,@grafana/plugins-platform-backend,2023-08-29,false,false,true -dashgpt,preview,@grafana/dashboards-squad,2023-11-17,false,false,true -reportingRetries,preview,@grafana/sharing-squad,2023-08-31,false,true,false -sseGroupByDatasource,experimental,@grafana/observability-metrics,2023-09-07,false,false,false -libraryPanelRBAC,experimental,@grafana/dashboards-squad,2023-10-11,false,true,false -lokiRunQueriesInParallel,privatePreview,@grafana/observability-logs,2023-09-19,false,false,false -wargamesTesting,experimental,@grafana/hosted-grafana-team,2023-09-13,false,false,false -alertingInsights,GA,@grafana/alerting-squad,2023-09-14,false,false,true -externalCorePlugins,experimental,@grafana/plugins-platform-backend,2023-09-22,false,false,false -pluginsAPIMetrics,experimental,@grafana/plugins-platform-backend,2023-09-21,false,false,true -idForwarding,experimental,@grafana/identity-access-team,2023-09-25,false,false,false -cloudWatchWildCardDimensionValues,GA,@grafana/aws-datasources,2023-09-27,false,false,false -externalServiceAccounts,preview,@grafana/identity-access-team,2023-09-28,false,false,false -panelMonitoring,experimental,@grafana/dataviz-squad,2023-10-08,false,false,true -enableNativeHTTPHistogram,experimental,@grafana/hosted-grafana-team,2023-10-03,false,false,false -formatString,preview,@grafana/grafana-bi-squad,2023-10-13,false,false,true -transformationsVariableSupport,preview,@grafana/grafana-bi-squad,2023-10-04,false,false,true -kubernetesPlaylists,experimental,@grafana/grafana-app-platform-squad,2023-11-08,false,true,false -kubernetesSnapshots,experimental,@grafana/grafana-app-platform-squad,2023-12-04,false,true,false -kubernetesQueryServiceRewrite,experimental,@grafana/grafana-app-platform-squad,2024-01-28,true,true,false -cloudWatchBatchQueries,preview,@grafana/aws-datasources,2023-10-20,false,false,false -recoveryThreshold,GA,@grafana/alerting-squad,2023-10-10,false,true,false -lokiStructuredMetadata,experimental,@grafana/observability-logs,2023-11-16,false,false,false -teamHttpHeaders,experimental,@grafana/identity-access-team,2023-10-17,false,false,false -awsDatasourcesNewFormStyling,preview,@grafana/aws-datasources,2023-10-12,false,false,true -cachingOptimizeSerializationMemoryUsage,experimental,@grafana/grafana-operator-experience-squad,2023-10-12,false,false,false -panelTitleSearchInV1,experimental,@grafana/backend-platform,2023-10-13,true,false,false -pluginsInstrumentationStatusSource,experimental,@grafana/plugins-platform-backend,2023-10-17,false,false,false -managedPluginsInstall,preview,@grafana/plugins-platform-backend,2023-10-18,false,false,false -prometheusPromQAIL,experimental,@grafana/observability-metrics,2023-10-19,false,false,true -addFieldFromCalculationStatFunctions,preview,@grafana/grafana-bi-squad,2023-11-03,false,false,true -alertmanagerRemoteSecondary,experimental,@grafana/alerting-squad,2023-10-30,false,false,false -alertmanagerRemotePrimary,experimental,@grafana/alerting-squad,2023-10-30,false,false,false -alertmanagerRemoteOnly,experimental,@grafana/alerting-squad,2023-10-30,false,false,false -annotationPermissionUpdate,experimental,@grafana/identity-access-team,2023-10-31,false,false,false -extractFieldsNameDeduplication,experimental,@grafana/grafana-bi-squad,2023-11-02,false,false,true -dashboardSceneForViewers,experimental,@grafana/dashboards-squad,2023-11-02,false,false,true -dashboardScene,experimental,@grafana/dashboards-squad,2023-11-13,false,false,true -panelFilterVariable,experimental,@grafana/dashboards-squad,2023-11-03,false,false,true -pdfTables,preview,@grafana/sharing-squad,2023-11-06,false,false,false -ssoSettingsApi,experimental,@grafana/identity-access-team,2023-11-08,false,false,false -canvasPanelPanZoom,preview,@grafana/dataviz-squad,2023-12-27,false,false,true -logsInfiniteScrolling,experimental,@grafana/observability-logs,2023-11-09,false,false,true -flameGraphItemCollapsing,experimental,@grafana/observability-traces-and-profiling,2023-11-09,false,false,true -alertingDetailsViewV2,experimental,@grafana/alerting-squad,2023-11-09,false,false,true -datatrails,experimental,@grafana/dashboards-squad,2023-11-15,false,false,true -alertingSimplifiedRouting,experimental,@grafana/alerting-squad,2023-11-10,false,false,false -logRowsPopoverMenu,GA,@grafana/observability-logs,2023-11-16,false,false,true -pluginsSkipHostEnvVars,experimental,@grafana/plugins-platform-backend,2023-11-15,false,false,false -tableSharedCrosshair,experimental,@grafana/grafana-bi-squad,2023-12-12,false,false,true -regressionTransformation,preview,@grafana/grafana-bi-squad,2023-11-24,false,false,true -displayAnonymousStats,GA,@grafana/identity-access-team,2023-11-29,false,false,true -lokiQueryHints,GA,@grafana/observability-logs,2023-12-18,false,false,true -kubernetesFeatureToggles,experimental,@grafana/grafana-operator-experience-squad,2023-12-22,false,false,true -alertingPreviewUpgrade,GA,@grafana/alerting-squad,2024-01-03,false,true,false -enablePluginsTracingByDefault,experimental,@grafana/plugins-platform-backend,2024-01-09,false,true,false -cloudRBACRoles,experimental,@grafana/identity-access-team,2024-01-10,false,true,false -alertingQueryOptimization,GA,@grafana/alerting-squad,2024-01-10,false,false,false -newFolderPicker,experimental,@grafana/grafana-frontend-platform,2024-01-12,false,false,true -jitterAlertRulesWithinGroups,preview,@grafana/alerting-squad,2024-01-17,false,true,false -onPremToCloudMigrations,experimental,@grafana/grafana-operator-experience-squad,2024-01-22,false,false,false -alertingSaveStatePeriodic,privatePreview,@grafana/alerting-squad,2024-01-22,false,false,false -promQLScope,experimental,@grafana/observability-metrics,2024-01-29,false,false,false -nodeGraphDotLayout,experimental,@grafana/observability-traces-and-profiling,2024-01-02,false,false,true -groupToNestedTableTransformation,preview,@grafana/dataviz-squad,2024-02-05,false,false,true -newPDFRendering,experimental,@grafana/sharing-squad,2024-02-08,false,false,false +Name,Stage,Owner,requiresDevMode,RequiresRestart,FrontendOnly +disableEnvelopeEncryption,GA,@grafana/grafana-as-code,false,false,false +live-service-web-worker,experimental,@grafana/grafana-app-platform-squad,false,false,true +queryOverLive,experimental,@grafana/grafana-app-platform-squad,false,false,true +panelTitleSearch,preview,@grafana/grafana-app-platform-squad,false,false,false +publicDashboards,GA,@grafana/sharing-squad,false,false,false +publicDashboardsEmailSharing,preview,@grafana/sharing-squad,false,false,false +lokiExperimentalStreaming,experimental,@grafana/observability-logs,false,false,false +featureHighlights,GA,@grafana/grafana-as-code,false,false,false +migrationLocking,preview,@grafana/backend-platform,false,false,false +storage,experimental,@grafana/grafana-app-platform-squad,false,false,false +correlations,GA,@grafana/explore-squad,false,false,false +exploreContentOutline,GA,@grafana/explore-squad,false,false,true +datasourceQueryMultiStatus,experimental,@grafana/plugins-platform-backend,false,false,false +traceToMetrics,experimental,@grafana/observability-traces-and-profiling,false,false,true +autoMigrateOldPanels,preview,@grafana/dataviz-squad,false,false,true +autoMigrateGraphPanel,preview,@grafana/dataviz-squad,false,false,true +disableAngular,preview,@grafana/dataviz-squad,false,false,true +canvasPanelNesting,experimental,@grafana/dataviz-squad,false,false,true +newVizTooltips,preview,@grafana/dataviz-squad,false,false,true +scenes,experimental,@grafana/dashboards-squad,false,false,true +disableSecretsCompatibility,experimental,@grafana/hosted-grafana-team,false,true,false +logRequestsInstrumentedAsUnknown,experimental,@grafana/hosted-grafana-team,false,false,false +dataConnectionsConsole,GA,@grafana/plugins-platform-backend,false,false,false +topnav,deprecated,@grafana/grafana-frontend-platform,false,false,false +returnToPrevious,experimental,@grafana/grafana-frontend-platform,false,false,true +grpcServer,preview,@grafana/grafana-app-platform-squad,false,false,false +unifiedStorage,experimental,@grafana/grafana-app-platform-squad,true,true,false +cloudWatchCrossAccountQuerying,GA,@grafana/aws-datasources,false,false,false +redshiftAsyncQueryDataSupport,GA,@grafana/aws-datasources,false,false,false +athenaAsyncQueryDataSupport,GA,@grafana/aws-datasources,false,false,true +showDashboardValidationWarnings,experimental,@grafana/dashboards-squad,false,false,false +mysqlAnsiQuotes,experimental,@grafana/backend-platform,false,false,false +accessControlOnCall,preview,@grafana/identity-access-team,false,false,false +nestedFolders,preview,@grafana/backend-platform,false,false,false +nestedFolderPicker,GA,@grafana/grafana-frontend-platform,false,false,true +alertingBacktesting,experimental,@grafana/alerting-squad,false,false,false +editPanelCSVDragAndDrop,experimental,@grafana/grafana-bi-squad,false,false,true +alertingNoNormalState,preview,@grafana/alerting-squad,false,false,false +logsContextDatasourceUi,GA,@grafana/observability-logs,false,false,true +lokiQuerySplitting,GA,@grafana/observability-logs,false,false,true +lokiQuerySplittingConfig,experimental,@grafana/observability-logs,false,false,true +individualCookiePreferences,experimental,@grafana/backend-platform,false,false,false +prometheusMetricEncyclopedia,GA,@grafana/observability-metrics,false,false,true +influxdbBackendMigration,GA,@grafana/observability-metrics,false,false,true +influxqlStreamingParser,experimental,@grafana/observability-metrics,false,false,false +influxdbRunQueriesInParallel,privatePreview,@grafana/observability-metrics,false,false,false +clientTokenRotation,GA,@grafana/identity-access-team,false,false,false +prometheusDataplane,GA,@grafana/observability-metrics,false,false,false +lokiMetricDataplane,GA,@grafana/observability-logs,false,false,false +lokiLogsDataplane,experimental,@grafana/observability-logs,false,false,false +dataplaneFrontendFallback,GA,@grafana/observability-metrics,false,false,true +disableSSEDataplane,experimental,@grafana/observability-metrics,false,false,false +alertStateHistoryLokiSecondary,experimental,@grafana/alerting-squad,false,false,false +alertStateHistoryLokiPrimary,experimental,@grafana/alerting-squad,false,false,false +alertStateHistoryLokiOnly,experimental,@grafana/alerting-squad,false,false,false +unifiedRequestLog,experimental,@grafana/backend-platform,false,false,false +renderAuthJWT,preview,@grafana/grafana-as-code,false,false,false +externalServiceAuth,experimental,@grafana/identity-access-team,true,false,false +refactorVariablesTimeRange,preview,@grafana/dashboards-squad,false,false,false +enableElasticsearchBackendQuerying,GA,@grafana/observability-logs,false,false,false +faroDatasourceSelector,preview,@grafana/app-o11y,false,false,true +enableDatagridEditing,preview,@grafana/grafana-bi-squad,false,false,true +extraThemes,experimental,@grafana/grafana-frontend-platform,false,false,true +lokiPredefinedOperations,experimental,@grafana/observability-logs,false,false,true +pluginsFrontendSandbox,experimental,@grafana/plugins-platform-backend,false,false,true +dashboardEmbed,experimental,@grafana/grafana-as-code,false,false,true +frontendSandboxMonitorOnly,experimental,@grafana/plugins-platform-backend,false,false,true +sqlDatasourceDatabaseSelection,preview,@grafana/grafana-bi-squad,false,false,true +lokiFormatQuery,experimental,@grafana/observability-logs,false,false,true +cloudWatchLogsMonacoEditor,GA,@grafana/aws-datasources,false,false,true +exploreScrollableLogsContainer,experimental,@grafana/observability-logs,false,false,true +recordedQueriesMulti,GA,@grafana/observability-metrics,false,false,false +pluginsDynamicAngularDetectionPatterns,experimental,@grafana/plugins-platform-backend,false,false,false +vizAndWidgetSplit,experimental,@grafana/dashboards-squad,false,false,true +prometheusIncrementalQueryInstrumentation,experimental,@grafana/observability-metrics,false,false,true +logsExploreTableVisualisation,experimental,@grafana/observability-logs,false,false,true +awsDatasourcesTempCredentials,experimental,@grafana/aws-datasources,false,false,false +transformationsRedesign,GA,@grafana/observability-metrics,false,false,true +mlExpressions,experimental,@grafana/alerting-squad,false,false,false +traceQLStreaming,experimental,@grafana/observability-traces-and-profiling,false,false,true +metricsSummary,experimental,@grafana/observability-traces-and-profiling,false,false,true +grafanaAPIServerWithExperimentalAPIs,experimental,@grafana/grafana-app-platform-squad,true,true,false +grafanaAPIServerEnsureKubectlAccess,experimental,@grafana/grafana-app-platform-squad,true,true,false +featureToggleAdminPage,experimental,@grafana/grafana-operator-experience-squad,false,true,false +awsAsyncQueryCaching,GA,@grafana/aws-datasources,false,false,false +splitScopes,deprecated,@grafana/identity-access-team,false,true,false +permissionsFilterRemoveSubquery,experimental,@grafana/backend-platform,false,false,false +prometheusConfigOverhaulAuth,GA,@grafana/observability-metrics,false,false,false +configurableSchedulerTick,experimental,@grafana/alerting-squad,false,true,false +influxdbSqlSupport,GA,@grafana/observability-metrics,false,true,false +alertingNoDataErrorExecution,GA,@grafana/alerting-squad,false,true,false +angularDeprecationUI,experimental,@grafana/plugins-platform-backend,false,false,true +dashgpt,preview,@grafana/dashboards-squad,false,false,true +reportingRetries,preview,@grafana/sharing-squad,false,true,false +sseGroupByDatasource,experimental,@grafana/observability-metrics,false,false,false +libraryPanelRBAC,experimental,@grafana/dashboards-squad,false,true,false +lokiRunQueriesInParallel,privatePreview,@grafana/observability-logs,false,false,false +wargamesTesting,experimental,@grafana/hosted-grafana-team,false,false,false +alertingInsights,GA,@grafana/alerting-squad,false,false,true +externalCorePlugins,experimental,@grafana/plugins-platform-backend,false,false,false +pluginsAPIMetrics,experimental,@grafana/plugins-platform-backend,false,false,true +idForwarding,experimental,@grafana/identity-access-team,false,false,false +cloudWatchWildCardDimensionValues,GA,@grafana/aws-datasources,false,false,false +externalServiceAccounts,preview,@grafana/identity-access-team,false,false,false +panelMonitoring,experimental,@grafana/dataviz-squad,false,false,true +enableNativeHTTPHistogram,experimental,@grafana/hosted-grafana-team,false,false,false +formatString,preview,@grafana/grafana-bi-squad,false,false,true +transformationsVariableSupport,preview,@grafana/grafana-bi-squad,false,false,true +kubernetesPlaylists,experimental,@grafana/grafana-app-platform-squad,false,true,false +kubernetesSnapshots,experimental,@grafana/grafana-app-platform-squad,false,true,false +kubernetesQueryServiceRewrite,experimental,@grafana/grafana-app-platform-squad,true,true,false +cloudWatchBatchQueries,preview,@grafana/aws-datasources,false,false,false +recoveryThreshold,GA,@grafana/alerting-squad,false,true,false +lokiStructuredMetadata,experimental,@grafana/observability-logs,false,false,false +teamHttpHeaders,experimental,@grafana/identity-access-team,false,false,false +awsDatasourcesNewFormStyling,preview,@grafana/aws-datasources,false,false,true +cachingOptimizeSerializationMemoryUsage,experimental,@grafana/grafana-operator-experience-squad,false,false,false +panelTitleSearchInV1,experimental,@grafana/backend-platform,true,false,false +pluginsInstrumentationStatusSource,experimental,@grafana/plugins-platform-backend,false,false,false +managedPluginsInstall,preview,@grafana/plugins-platform-backend,false,false,false +prometheusPromQAIL,experimental,@grafana/observability-metrics,false,false,true +addFieldFromCalculationStatFunctions,preview,@grafana/grafana-bi-squad,false,false,true +alertmanagerRemoteSecondary,experimental,@grafana/alerting-squad,false,false,false +alertmanagerRemotePrimary,experimental,@grafana/alerting-squad,false,false,false +alertmanagerRemoteOnly,experimental,@grafana/alerting-squad,false,false,false +annotationPermissionUpdate,experimental,@grafana/identity-access-team,false,false,false +extractFieldsNameDeduplication,experimental,@grafana/grafana-bi-squad,false,false,true +dashboardSceneForViewers,experimental,@grafana/dashboards-squad,false,false,true +dashboardScene,experimental,@grafana/dashboards-squad,false,false,true +panelFilterVariable,experimental,@grafana/dashboards-squad,false,false,true +pdfTables,preview,@grafana/sharing-squad,false,false,false +ssoSettingsApi,experimental,@grafana/identity-access-team,false,false,false +canvasPanelPanZoom,preview,@grafana/dataviz-squad,false,false,true +logsInfiniteScrolling,experimental,@grafana/observability-logs,false,false,true +flameGraphItemCollapsing,experimental,@grafana/observability-traces-and-profiling,false,false,true +alertingDetailsViewV2,experimental,@grafana/alerting-squad,false,false,true +datatrails,experimental,@grafana/dashboards-squad,false,false,true +alertingSimplifiedRouting,experimental,@grafana/alerting-squad,false,false,false +logRowsPopoverMenu,GA,@grafana/observability-logs,false,false,true +pluginsSkipHostEnvVars,experimental,@grafana/plugins-platform-backend,false,false,false +tableSharedCrosshair,experimental,@grafana/grafana-bi-squad,false,false,true +regressionTransformation,preview,@grafana/grafana-bi-squad,false,false,true +displayAnonymousStats,GA,@grafana/identity-access-team,false,false,true +lokiQueryHints,GA,@grafana/observability-logs,false,false,true +kubernetesFeatureToggles,experimental,@grafana/grafana-operator-experience-squad,false,false,true +alertingPreviewUpgrade,GA,@grafana/alerting-squad,false,true,false +enablePluginsTracingByDefault,experimental,@grafana/plugins-platform-backend,false,true,false +cloudRBACRoles,experimental,@grafana/identity-access-team,false,true,false +alertingQueryOptimization,GA,@grafana/alerting-squad,false,false,false +newFolderPicker,experimental,@grafana/grafana-frontend-platform,false,false,true +jitterAlertRulesWithinGroups,preview,@grafana/alerting-squad,false,true,false +onPremToCloudMigrations,experimental,@grafana/grafana-operator-experience-squad,false,false,false +alertingSaveStatePeriodic,privatePreview,@grafana/alerting-squad,false,false,false +promQLScope,experimental,@grafana/observability-metrics,false,false,false +nodeGraphDotLayout,experimental,@grafana/observability-traces-and-profiling,false,false,true +groupToNestedTableTransformation,preview,@grafana/dataviz-squad,false,false,true +newPDFRendering,experimental,@grafana/sharing-squad,false,false,false diff --git a/pkg/services/featuremgmt/toggles_gen.json b/pkg/services/featuremgmt/toggles_gen.json new file mode 100644 index 00000000000..2d16608d938 --- /dev/null +++ b/pkg/services/featuremgmt/toggles_gen.json @@ -0,0 +1,2028 @@ +{ + "kind": "FeatureList", + "apiVersion": "featuretoggle.grafana.app/v0alpha1", + "metadata": {}, + "items": [ + { + "metadata": { + "name": "disableEnvelopeEncryption", + "resourceVersion": "1653393600000", + "creationTimestamp": "2022-05-24T12:00:00Z" + }, + "spec": { + "description": "Disable envelope encryption (emergency only)", + "stage": "GA", + "codeowner": "@grafana/grafana-as-code", + "hideFromAdminPage": true + } + }, + { + "metadata": { + "name": "live-service-web-worker", + "resourceVersion": "1636459200000", + "creationTimestamp": "2021-11-09T12:00:00Z" + }, + "spec": { + "description": "This will use a webworker thread to processes events rather than the main thread", + "stage": "experimental", + "codeowner": "@grafana/grafana-app-platform-squad", + "frontend": true + } + }, + { + "metadata": { + "name": "queryOverLive", + "resourceVersion": "1641384000000", + "creationTimestamp": "2022-01-05T12:00:00Z" + }, + "spec": { + "description": "Use Grafana Live WebSocket to execute backend queries", + "stage": "experimental", + "codeowner": "@grafana/grafana-app-platform-squad", + "frontend": true + } + }, + { + "metadata": { + "name": "panelTitleSearch", + "resourceVersion": "1644926400000", + "creationTimestamp": "2022-02-15T12:00:00Z" + }, + "spec": { + "description": "Search for dashboards using panel title", + "stage": "preview", + "codeowner": "@grafana/grafana-app-platform-squad", + "hideFromAdminPage": true + } + }, + { + "metadata": { + "name": "publicDashboards", + "resourceVersion": "1649332800000", + "creationTimestamp": "2022-04-07T12:00:00Z" + }, + "spec": { + "description": "[Deprecated] Public dashboards are now enabled by default; to disable them, use the configuration setting. This feature toggle will be removed in the next major version.", + "stage": "GA", + "codeowner": "@grafana/sharing-squad", + "allowSelfServe": true + } + }, + { + "metadata": { + "name": "publicDashboardsEmailSharing", + "resourceVersion": "1671624000000", + "creationTimestamp": "2022-12-21T12:00:00Z" + }, + "spec": { + "description": "Enables public dashboard sharing to be restricted to only allowed emails", + "stage": "preview", + "codeowner": "@grafana/sharing-squad", + "hideFromAdminPage": true, + "hideFromDocs": true + } + }, + { + "metadata": { + "name": "lokiExperimentalStreaming", + "resourceVersion": "1687176000000", + "creationTimestamp": "2023-06-19T12:00:00Z" + }, + "spec": { + "description": "Support new streaming approach for loki (prototype, needs special loki build)", + "stage": "experimental", + "codeowner": "@grafana/observability-logs" + } + }, + { + "metadata": { + "name": "featureHighlights", + "resourceVersion": "1643889600000", + "creationTimestamp": "2022-02-03T12:00:00Z" + }, + "spec": { + "description": "Highlight Grafana Enterprise features", + "stage": "GA", + "codeowner": "@grafana/grafana-as-code", + "allowSelfServe": true + } + }, + { + "metadata": { + "name": "migrationLocking", + "resourceVersion": "1644926400000", + "creationTimestamp": "2022-02-15T12:00:00Z" + }, + "spec": { + "description": "Lock database during migrations", + "stage": "preview", + "codeowner": "@grafana/backend-platform" + } + }, + { + "metadata": { + "name": "storage", + "resourceVersion": "1647518400000", + "creationTimestamp": "2022-03-17T12:00:00Z" + }, + "spec": { + "description": "Configurable storage for dashboards, datasources, and resources", + "stage": "experimental", + "codeowner": "@grafana/grafana-app-platform-squad" + } + }, + { + "metadata": { + "name": "correlations", + "resourceVersion": "1663329600000", + "creationTimestamp": "2022-09-16T12:00:00Z" + }, + "spec": { + "description": "Correlations page", + "stage": "GA", + "codeowner": "@grafana/explore-squad", + "allowSelfServe": true + } + }, + { + "metadata": { + "name": "exploreContentOutline", + "resourceVersion": "1699012800000", + "creationTimestamp": "2023-11-03T12:00:00Z" + }, + "spec": { + "description": "Content outline sidebar", + "stage": "GA", + "codeowner": "@grafana/explore-squad", + "frontend": true, + "allowSelfServe": true + } + }, + { + "metadata": { + "name": "datasourceQueryMultiStatus", + "resourceVersion": "1651579200000", + "creationTimestamp": "2022-05-03T12:00:00Z" + }, + "spec": { + "description": "Introduce HTTP 207 Multi Status for api/ds/query", + "stage": "experimental", + "codeowner": "@grafana/plugins-platform-backend" + } + }, + { + "metadata": { + "name": "traceToMetrics", + "resourceVersion": "1646654400000", + "creationTimestamp": "2022-03-07T12:00:00Z" + }, + "spec": { + "description": "Enable trace to metrics links", + "stage": "experimental", + "codeowner": "@grafana/observability-traces-and-profiling", + "frontend": true + } + }, + { + "metadata": { + "name": "autoMigrateOldPanels", + "resourceVersion": "1654948800000", + "creationTimestamp": "2022-06-11T12:00:00Z" + }, + "spec": { + "description": "Migrate old angular panels to supported versions (graph, table-old, worldmap, etc)", + "stage": "preview", + "codeowner": "@grafana/dataviz-squad", + "frontend": true + } + }, + { + "metadata": { + "name": "disableAngular", + "resourceVersion": "1679572800000", + "creationTimestamp": "2023-03-23T12:00:00Z" + }, + "spec": { + "description": "Dynamic flag to disable angular at runtime. The preferred method is to set `angular_support_enabled` to `false` in the [security] settings, which allows you to change the state at runtime.", + "stage": "preview", + "codeowner": "@grafana/dataviz-squad", + "frontend": true, + "hideFromAdminPage": true + } + }, + { + "metadata": { + "name": "canvasPanelNesting", + "resourceVersion": "1653998400000", + "creationTimestamp": "2022-05-31T12:00:00Z" + }, + "spec": { + "description": "Allow elements nesting", + "stage": "experimental", + "codeowner": "@grafana/dataviz-squad", + "frontend": true, + "hideFromAdminPage": true + } + }, + { + "metadata": { + "name": "newVizTooltips", + "resourceVersion": "1699012800000", + "creationTimestamp": "2023-11-03T12:00:00Z" + }, + "spec": { + "description": "New visualizations tooltips UX", + "stage": "preview", + "codeowner": "@grafana/dataviz-squad", + "frontend": true + } + }, + { + "metadata": { + "name": "scenes", + "resourceVersion": "1657195200000", + "creationTimestamp": "2022-07-07T12:00:00Z" + }, + "spec": { + "description": "Experimental framework to build interactive dashboards", + "stage": "experimental", + "codeowner": "@grafana/dashboards-squad", + "frontend": true + } + }, + { + "metadata": { + "name": "disableSecretsCompatibility", + "resourceVersion": "1657713600000", + "creationTimestamp": "2022-07-13T12:00:00Z" + }, + "spec": { + "description": "Disable duplicated secret storage in legacy tables", + "stage": "experimental", + "codeowner": "@grafana/hosted-grafana-team", + "requiresRestart": true + } + }, + { + "metadata": { + "name": "logRequestsInstrumentedAsUnknown", + "resourceVersion": "1654862400000", + "creationTimestamp": "2022-06-10T12:00:00Z" + }, + "spec": { + "description": "Logs the path for requests that are instrumented as unknown", + "stage": "experimental", + "codeowner": "@grafana/hosted-grafana-team" + } + }, + { + "metadata": { + "name": "dataConnectionsConsole", + "resourceVersion": "1654084800000", + "creationTimestamp": "2022-06-01T12:00:00Z" + }, + "spec": { + "description": "Enables a new top-level page called Connections. This page is an experiment that provides a better experience when you install and configure data sources and other plugins.", + "stage": "GA", + "codeowner": "@grafana/plugins-platform-backend", + "allowSelfServe": true + } + }, + { + "metadata": { + "name": "topnav", + "resourceVersion": "1655726400000", + "creationTimestamp": "2022-06-20T12:00:00Z" + }, + "spec": { + "description": "Enables topnav support in external plugins. The new Grafana navigation cannot be disabled.", + "stage": "deprecated", + "codeowner": "@grafana/grafana-frontend-platform" + } + }, + { + "metadata": { + "name": "returnToPrevious", + "resourceVersion": "1704798000000", + "creationTimestamp": "2024-01-09T11:00:00Z" + }, + "spec": { + "description": "Enables the return to previous context functionality", + "stage": "experimental", + "codeowner": "@grafana/grafana-frontend-platform", + "frontend": true + } + }, + { + "metadata": { + "name": "grpcServer", + "resourceVersion": "1664280000000", + "creationTimestamp": "2022-09-27T12:00:00Z" + }, + "spec": { + "description": "Run the GRPC server", + "stage": "preview", + "codeowner": "@grafana/grafana-app-platform-squad", + "hideFromAdminPage": true + } + }, + { + "metadata": { + "name": "unifiedStorage", + "resourceVersion": "1669896000000", + "creationTimestamp": "2022-12-01T12:00:00Z" + }, + "spec": { + "description": "SQL-based k8s storage", + "stage": "experimental", + "codeowner": "@grafana/grafana-app-platform-squad", + "requiresDevMode": true, + "requiresRestart": true + } + }, + { + "metadata": { + "name": "cloudWatchCrossAccountQuerying", + "resourceVersion": "1669636800000", + "creationTimestamp": "2022-11-28T12:00:00Z" + }, + "spec": { + "description": "Enables cross-account querying in CloudWatch datasources", + "stage": "GA", + "codeowner": "@grafana/aws-datasources", + "allowSelfServe": true + } + }, + { + "metadata": { + "name": "redshiftAsyncQueryDataSupport", + "resourceVersion": "1661601600000", + "creationTimestamp": "2022-08-27T12:00:00Z" + }, + "spec": { + "description": "Enable async query data support for Redshift", + "stage": "GA", + "codeowner": "@grafana/aws-datasources" + } + }, + { + "metadata": { + "name": "athenaAsyncQueryDataSupport", + "resourceVersion": "1661601600000", + "creationTimestamp": "2022-08-27T12:00:00Z" + }, + "spec": { + "description": "Enable async query data support for Athena", + "stage": "GA", + "codeowner": "@grafana/aws-datasources", + "frontend": true + } + }, + { + "metadata": { + "name": "showDashboardValidationWarnings", + "resourceVersion": "1665748800000", + "creationTimestamp": "2022-10-14T12:00:00Z" + }, + "spec": { + "description": "Show warnings when dashboards do not validate against the schema", + "stage": "experimental", + "codeowner": "@grafana/dashboards-squad" + } + }, + { + "metadata": { + "name": "mysqlAnsiQuotes", + "resourceVersion": "1665576000000", + "creationTimestamp": "2022-10-12T12:00:00Z" + }, + "spec": { + "description": "Use double quotes to escape keyword in a MySQL query", + "stage": "experimental", + "codeowner": "@grafana/backend-platform" + } + }, + { + "metadata": { + "name": "accessControlOnCall", + "resourceVersion": "1666180800000", + "creationTimestamp": "2022-10-19T12:00:00Z" + }, + "spec": { + "description": "Access control primitives for OnCall", + "stage": "preview", + "codeowner": "@grafana/identity-access-team", + "hideFromAdminPage": true + } + }, + { + "metadata": { + "name": "nestedFolders", + "resourceVersion": "1666440000000", + "creationTimestamp": "2022-10-22T12:00:00Z" + }, + "spec": { + "description": "Enable folder nesting", + "stage": "preview", + "codeowner": "@grafana/backend-platform" + } + }, + { + "metadata": { + "name": "nestedFolderPicker", + "resourceVersion": "1690200000000", + "creationTimestamp": "2023-07-24T12:00:00Z" + }, + "spec": { + "description": "Enables the new folder picker to work with nested folders. Requires the nestedFolders feature toggle", + "stage": "GA", + "codeowner": "@grafana/grafana-frontend-platform", + "frontend": true, + "allowSelfServe": true + } + }, + { + "metadata": { + "name": "alertingBacktesting", + "resourceVersion": "1666267200000", + "creationTimestamp": "2022-10-20T12:00:00Z" + }, + "spec": { + "description": "Rule backtesting API for alerting", + "stage": "experimental", + "codeowner": "@grafana/alerting-squad" + } + }, + { + "metadata": { + "name": "editPanelCSVDragAndDrop", + "resourceVersion": "1671537600000", + "creationTimestamp": "2022-12-20T12:00:00Z" + }, + "spec": { + "description": "Enables drag and drop for CSV and Excel files", + "stage": "experimental", + "codeowner": "@grafana/grafana-bi-squad", + "frontend": true + } + }, + { + "metadata": { + "name": "alertingNoNormalState", + "resourceVersion": "1673697600000", + "creationTimestamp": "2023-01-14T12:00:00Z" + }, + "spec": { + "description": "Stop maintaining state of alerts that are not firing", + "stage": "preview", + "codeowner": "@grafana/alerting-squad", + "hideFromAdminPage": true + } + }, + { + "metadata": { + "name": "logsContextDatasourceUi", + "resourceVersion": "1674820800000", + "creationTimestamp": "2023-01-27T12:00:00Z" + }, + "spec": { + "description": "Allow datasource to provide custom UI for context view", + "stage": "GA", + "codeowner": "@grafana/observability-logs", + "frontend": true, + "allowSelfServe": true + } + }, + { + "metadata": { + "name": "lokiQuerySplitting", + "resourceVersion": "1675944000000", + "creationTimestamp": "2023-02-09T12:00:00Z" + }, + "spec": { + "description": "Split large interval queries into subqueries with smaller time intervals", + "stage": "GA", + "codeowner": "@grafana/observability-logs", + "frontend": true, + "allowSelfServe": true + } + }, + { + "metadata": { + "name": "lokiQuerySplittingConfig", + "resourceVersion": "1679313600000", + "creationTimestamp": "2023-03-20T12:00:00Z" + }, + "spec": { + "description": "Give users the option to configure split durations for Loki queries", + "stage": "experimental", + "codeowner": "@grafana/observability-logs", + "frontend": true + } + }, + { + "metadata": { + "name": "individualCookiePreferences", + "resourceVersion": "1677153600000", + "creationTimestamp": "2023-02-23T12:00:00Z" + }, + "spec": { + "description": "Support overriding cookie preferences per user", + "stage": "experimental", + "codeowner": "@grafana/backend-platform" + } + }, + { + "metadata": { + "name": "prometheusMetricEncyclopedia", + "resourceVersion": "1678190400000", + "creationTimestamp": "2023-03-07T12:00:00Z" + }, + "spec": { + "description": "Adds the metrics explorer component to the Prometheus query builder as an option in metric select", + "stage": "GA", + "codeowner": "@grafana/observability-metrics", + "frontend": true, + "allowSelfServe": true + } + }, + { + "metadata": { + "name": "influxdbBackendMigration", + "resourceVersion": "1678881600000", + "creationTimestamp": "2023-03-15T12:00:00Z" + }, + "spec": { + "description": "Query InfluxDB InfluxQL without the proxy", + "stage": "GA", + "codeowner": "@grafana/observability-metrics", + "frontend": true + } + }, + { + "metadata": { + "name": "influxqlStreamingParser", + "resourceVersion": "1701259200000", + "creationTimestamp": "2023-11-29T12:00:00Z" + }, + "spec": { + "description": "Enable streaming JSON parser for InfluxDB datasource InfluxQL query language", + "stage": "experimental", + "codeowner": "@grafana/observability-metrics" + } + }, + { + "metadata": { + "name": "influxdbRunQueriesInParallel", + "resourceVersion": "1706529600000", + "creationTimestamp": "2024-01-29T12:00:00Z" + }, + "spec": { + "description": "Enables running InfluxDB Influxql queries in parallel", + "stage": "privatePreview", + "codeowner": "@grafana/observability-metrics" + } + }, + { + "metadata": { + "name": "clientTokenRotation", + "resourceVersion": "1679572800000", + "creationTimestamp": "2023-03-23T12:00:00Z" + }, + "spec": { + "description": "Replaces the current in-request token rotation so that the client initiates the rotation", + "stage": "GA", + "codeowner": "@grafana/identity-access-team" + } + }, + { + "metadata": { + "name": "prometheusDataplane", + "resourceVersion": "1680091200000", + "creationTimestamp": "2023-03-29T12:00:00Z" + }, + "spec": { + "description": "Changes responses to from Prometheus to be compliant with the dataplane specification. In particular, when this feature toggle is active, the numeric `Field.Name` is set from 'Value' to the value of the `__name__` label.", + "stage": "GA", + "codeowner": "@grafana/observability-metrics", + "allowSelfServe": true + } + }, + { + "metadata": { + "name": "lokiMetricDataplane", + "resourceVersion": "1681387200000", + "creationTimestamp": "2023-04-13T12:00:00Z" + }, + "spec": { + "description": "Changes metric responses from Loki to be compliant with the dataplane specification.", + "stage": "GA", + "codeowner": "@grafana/observability-logs", + "allowSelfServe": true + } + }, + { + "metadata": { + "name": "lokiLogsDataplane", + "resourceVersion": "1689249600000", + "creationTimestamp": "2023-07-13T12:00:00Z" + }, + "spec": { + "description": "Changes logs responses from Loki to be compliant with the dataplane specification.", + "stage": "experimental", + "codeowner": "@grafana/observability-logs" + } + }, + { + "metadata": { + "name": "dataplaneFrontendFallback", + "resourceVersion": "1682337600000", + "creationTimestamp": "2023-04-24T12:00:00Z" + }, + "spec": { + "description": "Support dataplane contract field name change for transformations and field name matchers where the name is different", + "stage": "GA", + "codeowner": "@grafana/observability-metrics", + "frontend": true, + "allowSelfServe": true + } + }, + { + "metadata": { + "name": "disableSSEDataplane", + "resourceVersion": "1682337600000", + "creationTimestamp": "2023-04-24T12:00:00Z" + }, + "spec": { + "description": "Disables dataplane specific processing in server side expressions.", + "stage": "experimental", + "codeowner": "@grafana/observability-metrics" + } + }, + { + "metadata": { + "name": "alertStateHistoryLokiSecondary", + "resourceVersion": "1680177600000", + "creationTimestamp": "2023-03-30T12:00:00Z" + }, + "spec": { + "description": "Enable Grafana to write alert state history to an external Loki instance in addition to Grafana annotations.", + "stage": "experimental", + "codeowner": "@grafana/alerting-squad" + } + }, + { + "metadata": { + "name": "alertStateHistoryLokiPrimary", + "resourceVersion": "1680177600000", + "creationTimestamp": "2023-03-30T12:00:00Z" + }, + "spec": { + "description": "Enable a remote Loki instance as the primary source for state history reads.", + "stage": "experimental", + "codeowner": "@grafana/alerting-squad" + } + }, + { + "metadata": { + "name": "alertStateHistoryLokiOnly", + "resourceVersion": "1680177600000", + "creationTimestamp": "2023-03-30T12:00:00Z" + }, + "spec": { + "description": "Disable Grafana alerts from emitting annotations when a remote Loki instance is available.", + "stage": "experimental", + "codeowner": "@grafana/alerting-squad" + } + }, + { + "metadata": { + "name": "unifiedRequestLog", + "resourceVersion": "1680264000000", + "creationTimestamp": "2023-03-31T12:00:00Z" + }, + "spec": { + "description": "Writes error logs to the request logger", + "stage": "experimental", + "codeowner": "@grafana/backend-platform" + } + }, + { + "metadata": { + "name": "renderAuthJWT", + "resourceVersion": "1680523200000", + "creationTimestamp": "2023-04-03T12:00:00Z" + }, + "spec": { + "description": "Uses JWT-based auth for rendering instead of relying on remote cache", + "stage": "preview", + "codeowner": "@grafana/grafana-as-code", + "hideFromAdminPage": true + } + }, + { + "metadata": { + "name": "externalServiceAuth", + "resourceVersion": "1681214400000", + "creationTimestamp": "2023-04-11T12:00:00Z" + }, + "spec": { + "description": "Starts an OAuth2 authentication provider for external services", + "stage": "experimental", + "codeowner": "@grafana/identity-access-team", + "requiresDevMode": true + } + }, + { + "metadata": { + "name": "refactorVariablesTimeRange", + "resourceVersion": "1686052800000", + "creationTimestamp": "2023-06-06T12:00:00Z" + }, + "spec": { + "description": "Refactor time range variables flow to reduce number of API calls made when query variables are chained", + "stage": "preview", + "codeowner": "@grafana/dashboards-squad", + "hideFromAdminPage": true + } + }, + { + "metadata": { + "name": "enableElasticsearchBackendQuerying", + "resourceVersion": "1681473600000", + "creationTimestamp": "2023-04-14T12:00:00Z" + }, + "spec": { + "description": "Enable the processing of queries and responses in the Elasticsearch data source through backend", + "stage": "GA", + "codeowner": "@grafana/observability-logs", + "allowSelfServe": true + } + }, + { + "metadata": { + "name": "faroDatasourceSelector", + "resourceVersion": "1683201600000", + "creationTimestamp": "2023-05-04T12:00:00Z" + }, + "spec": { + "description": "Enable the data source selector within the Frontend Apps section of the Frontend Observability", + "stage": "preview", + "codeowner": "@grafana/app-o11y", + "frontend": true + } + }, + { + "metadata": { + "name": "enableDatagridEditing", + "resourceVersion": "1682337600000", + "creationTimestamp": "2023-04-24T12:00:00Z" + }, + "spec": { + "description": "Enables the edit functionality in the datagrid panel", + "stage": "preview", + "codeowner": "@grafana/grafana-bi-squad", + "frontend": true + } + }, + { + "metadata": { + "name": "extraThemes", + "resourceVersion": "1683720000000", + "creationTimestamp": "2023-05-10T12:00:00Z" + }, + "spec": { + "description": "Enables extra themes", + "stage": "experimental", + "codeowner": "@grafana/grafana-frontend-platform", + "frontend": true + } + }, + { + "metadata": { + "name": "lokiPredefinedOperations", + "resourceVersion": "1685707200000", + "creationTimestamp": "2023-06-02T12:00:00Z" + }, + "spec": { + "description": "Adds predefined query operations to Loki query editor", + "stage": "experimental", + "codeowner": "@grafana/observability-logs", + "frontend": true + } + }, + { + "metadata": { + "name": "pluginsFrontendSandbox", + "resourceVersion": "1685966400000", + "creationTimestamp": "2023-06-05T12:00:00Z" + }, + "spec": { + "description": "Enables the plugins frontend sandbox", + "stage": "experimental", + "codeowner": "@grafana/plugins-platform-backend", + "frontend": true + } + }, + { + "metadata": { + "name": "dashboardEmbed", + "resourceVersion": "1688644800000", + "creationTimestamp": "2023-07-06T12:00:00Z" + }, + "spec": { + "description": "Allow embedding dashboard for external use in Code editors", + "stage": "experimental", + "codeowner": "@grafana/grafana-as-code", + "frontend": true + } + }, + { + "metadata": { + "name": "frontendSandboxMonitorOnly", + "resourceVersion": "1688558400000", + "creationTimestamp": "2023-07-05T12:00:00Z" + }, + "spec": { + "description": "Enables monitor only in the plugin frontend sandbox (if enabled)", + "stage": "experimental", + "codeowner": "@grafana/plugins-platform-backend", + "frontend": true + } + }, + { + "metadata": { + "name": "sqlDatasourceDatabaseSelection", + "resourceVersion": "1686052800000", + "creationTimestamp": "2023-06-06T12:00:00Z" + }, + "spec": { + "description": "Enables previous SQL data source dataset dropdown behavior", + "stage": "preview", + "codeowner": "@grafana/grafana-bi-squad", + "frontend": true, + "hideFromAdminPage": true + } + }, + { + "metadata": { + "name": "lokiFormatQuery", + "resourceVersion": "1687348800000", + "creationTimestamp": "2023-06-21T12:00:00Z" + }, + "spec": { + "description": "Enables the ability to format Loki queries", + "stage": "experimental", + "codeowner": "@grafana/observability-logs", + "frontend": true + } + }, + { + "metadata": { + "name": "cloudWatchLogsMonacoEditor", + "resourceVersion": "1686571200000", + "creationTimestamp": "2023-06-12T12:00:00Z" + }, + "spec": { + "description": "Enables the Monaco editor for CloudWatch Logs queries", + "stage": "GA", + "codeowner": "@grafana/aws-datasources", + "frontend": true, + "allowSelfServe": true + } + }, + { + "metadata": { + "name": "exploreScrollableLogsContainer", + "resourceVersion": "1686830400000", + "creationTimestamp": "2023-06-15T12:00:00Z" + }, + "spec": { + "description": "Improves the scrolling behavior of logs in Explore", + "stage": "experimental", + "codeowner": "@grafana/observability-logs", + "frontend": true + } + }, + { + "metadata": { + "name": "recordedQueriesMulti", + "resourceVersion": "1686744000000", + "creationTimestamp": "2023-06-14T12:00:00Z" + }, + "spec": { + "description": "Enables writing multiple items from a single query within Recorded Queries", + "stage": "GA", + "codeowner": "@grafana/observability-metrics" + } + }, + { + "metadata": { + "name": "pluginsDynamicAngularDetectionPatterns", + "resourceVersion": "1687780800000", + "creationTimestamp": "2023-06-26T12:00:00Z" + }, + "spec": { + "description": "Enables fetching Angular detection patterns for plugins from GCOM and fallback to hardcoded ones", + "stage": "experimental", + "codeowner": "@grafana/plugins-platform-backend" + } + }, + { + "metadata": { + "name": "vizAndWidgetSplit", + "resourceVersion": "1687867200000", + "creationTimestamp": "2023-06-27T12:00:00Z" + }, + "spec": { + "description": "Split panels between visualizations and widgets", + "stage": "experimental", + "codeowner": "@grafana/dashboards-squad", + "frontend": true + } + }, + { + "metadata": { + "name": "prometheusIncrementalQueryInstrumentation", + "resourceVersion": "1688558400000", + "creationTimestamp": "2023-07-05T12:00:00Z" + }, + "spec": { + "description": "Adds RudderStack events to incremental queries", + "stage": "experimental", + "codeowner": "@grafana/observability-metrics", + "frontend": true + } + }, + { + "metadata": { + "name": "logsExploreTableVisualisation", + "resourceVersion": "1689163200000", + "creationTimestamp": "2023-07-12T12:00:00Z" + }, + "spec": { + "description": "A table visualisation for logs in Explore", + "stage": "experimental", + "codeowner": "@grafana/observability-logs", + "frontend": true + } + }, + { + "metadata": { + "name": "awsDatasourcesTempCredentials", + "resourceVersion": "1688644800000", + "creationTimestamp": "2023-07-06T12:00:00Z" + }, + "spec": { + "description": "Support temporary security credentials in AWS plugins for Grafana Cloud customers", + "stage": "experimental", + "codeowner": "@grafana/aws-datasources" + } + }, + { + "metadata": { + "name": "transformationsRedesign", + "resourceVersion": "1689163200000", + "creationTimestamp": "2023-07-12T12:00:00Z" + }, + "spec": { + "description": "Enables the transformations redesign", + "stage": "GA", + "codeowner": "@grafana/observability-metrics", + "frontend": true, + "allowSelfServe": true + } + }, + { + "metadata": { + "name": "mlExpressions", + "resourceVersion": "1689249600000", + "creationTimestamp": "2023-07-13T12:00:00Z" + }, + "spec": { + "description": "Enable support for Machine Learning in server-side expressions", + "stage": "experimental", + "codeowner": "@grafana/alerting-squad" + } + }, + { + "metadata": { + "name": "traceQLStreaming", + "resourceVersion": "1690372800000", + "creationTimestamp": "2023-07-26T12:00:00Z" + }, + "spec": { + "description": "Enables response streaming of TraceQL queries of the Tempo data source", + "stage": "experimental", + "codeowner": "@grafana/observability-traces-and-profiling", + "frontend": true + } + }, + { + "metadata": { + "name": "metricsSummary", + "resourceVersion": "1693224000000", + "creationTimestamp": "2023-08-28T12:00:00Z" + }, + "spec": { + "description": "Enables metrics summary queries in the Tempo data source", + "stage": "experimental", + "codeowner": "@grafana/observability-traces-and-profiling", + "frontend": true + } + }, + { + "metadata": { + "name": "grafanaAPIServerWithExperimentalAPIs", + "resourceVersion": "1696593600000", + "creationTimestamp": "2023-10-06T12:00:00Z" + }, + "spec": { + "description": "Register experimental APIs with the k8s API server", + "stage": "experimental", + "codeowner": "@grafana/grafana-app-platform-squad", + "requiresDevMode": true, + "requiresRestart": true + } + }, + { + "metadata": { + "name": "grafanaAPIServerEnsureKubectlAccess", + "resourceVersion": "1701864000000", + "creationTimestamp": "2023-12-06T12:00:00Z" + }, + "spec": { + "description": "Start an additional https handler and write kubectl options", + "stage": "experimental", + "codeowner": "@grafana/grafana-app-platform-squad", + "requiresDevMode": true, + "requiresRestart": true + } + }, + { + "metadata": { + "name": "featureToggleAdminPage", + "resourceVersion": "1689681600000", + "creationTimestamp": "2023-07-18T12:00:00Z" + }, + "spec": { + "description": "Enable admin page for managing feature toggles from the Grafana front-end", + "stage": "experimental", + "codeowner": "@grafana/grafana-operator-experience-squad", + "requiresRestart": true + } + }, + { + "metadata": { + "name": "awsAsyncQueryCaching", + "resourceVersion": "1689940800000", + "creationTimestamp": "2023-07-21T12:00:00Z" + }, + "spec": { + "description": "Enable caching for async queries for Redshift and Athena. Requires that the datasource has caching and async query support enabled", + "stage": "GA", + "codeowner": "@grafana/aws-datasources" + } + }, + { + "metadata": { + "name": "splitScopes", + "resourceVersion": "1689940800000", + "creationTimestamp": "2023-07-21T12:00:00Z" + }, + "spec": { + "description": "Support faster dashboard and folder search by splitting permission scopes into parts", + "stage": "deprecated", + "codeowner": "@grafana/identity-access-team", + "requiresRestart": true, + "hideFromAdminPage": true + } + }, + { + "metadata": { + "name": "permissionsFilterRemoveSubquery", + "resourceVersion": "1690977600000", + "creationTimestamp": "2023-08-02T12:00:00Z" + }, + "spec": { + "description": "Alternative permission filter implementation that does not use subqueries for fetching the dashboard folder", + "stage": "experimental", + "codeowner": "@grafana/backend-platform" + } + }, + { + "metadata": { + "name": "prometheusConfigOverhaulAuth", + "resourceVersion": "1689940800000", + "creationTimestamp": "2023-07-21T12:00:00Z" + }, + "spec": { + "description": "Update the Prometheus configuration page with the new auth component", + "stage": "GA", + "codeowner": "@grafana/observability-metrics" + } + }, + { + "metadata": { + "name": "configurableSchedulerTick", + "resourceVersion": "1690372800000", + "creationTimestamp": "2023-07-26T12:00:00Z" + }, + "spec": { + "description": "Enable changing the scheduler base interval via configuration option unified_alerting.scheduler_tick_interval", + "stage": "experimental", + "codeowner": "@grafana/alerting-squad", + "requiresRestart": true, + "hideFromDocs": true + } + }, + { + "metadata": { + "name": "influxdbSqlSupport", + "resourceVersion": "1690977600000", + "creationTimestamp": "2023-08-02T12:00:00Z" + }, + "spec": { + "description": "Enable InfluxDB SQL query language support with new querying UI", + "stage": "GA", + "codeowner": "@grafana/observability-metrics", + "requiresRestart": true, + "allowSelfServe": true + } + }, + { + "metadata": { + "name": "alertingNoDataErrorExecution", + "resourceVersion": "1692100800000", + "creationTimestamp": "2023-08-15T12:00:00Z" + }, + "spec": { + "description": "Changes how Alerting state manager handles execution of NoData/Error", + "stage": "GA", + "codeowner": "@grafana/alerting-squad", + "requiresRestart": true + } + }, + { + "metadata": { + "name": "angularDeprecationUI", + "resourceVersion": "1693310400000", + "creationTimestamp": "2023-08-29T12:00:00Z" + }, + "spec": { + "description": "Display new Angular deprecation-related UI features", + "stage": "experimental", + "codeowner": "@grafana/plugins-platform-backend", + "frontend": true + } + }, + { + "metadata": { + "name": "dashgpt", + "resourceVersion": "1700222400000", + "creationTimestamp": "2023-11-17T12:00:00Z" + }, + "spec": { + "description": "Enable AI powered features in dashboards", + "stage": "preview", + "codeowner": "@grafana/dashboards-squad", + "frontend": true + } + }, + { + "metadata": { + "name": "reportingRetries", + "resourceVersion": "1693483200000", + "creationTimestamp": "2023-08-31T12:00:00Z" + }, + "spec": { + "description": "Enables rendering retries for the reporting feature", + "stage": "preview", + "codeowner": "@grafana/sharing-squad", + "requiresRestart": true + } + }, + { + "metadata": { + "name": "sseGroupByDatasource", + "resourceVersion": "1694088000000", + "creationTimestamp": "2023-09-07T12:00:00Z" + }, + "spec": { + "description": "Send query to the same datasource in a single request when using server side expressions. The `cloudWatchBatchQueries` feature toggle should be enabled if this used with CloudWatch.", + "stage": "experimental", + "codeowner": "@grafana/observability-metrics" + } + }, + { + "metadata": { + "name": "libraryPanelRBAC", + "resourceVersion": "1697025600000", + "creationTimestamp": "2023-10-11T12:00:00Z" + }, + "spec": { + "description": "Enables RBAC support for library panels", + "stage": "experimental", + "codeowner": "@grafana/dashboards-squad", + "requiresRestart": true + } + }, + { + "metadata": { + "name": "lokiRunQueriesInParallel", + "resourceVersion": "1695124800000", + "creationTimestamp": "2023-09-19T12:00:00Z" + }, + "spec": { + "description": "Enables running Loki queries in parallel", + "stage": "privatePreview", + "codeowner": "@grafana/observability-logs" + } + }, + { + "metadata": { + "name": "wargamesTesting", + "resourceVersion": "1694606400000", + "creationTimestamp": "2023-09-13T12:00:00Z" + }, + "spec": { + "description": "Placeholder feature flag for internal testing", + "stage": "experimental", + "codeowner": "@grafana/hosted-grafana-team" + } + }, + { + "metadata": { + "name": "alertingInsights", + "resourceVersion": "1694692800000", + "creationTimestamp": "2023-09-14T12:00:00Z" + }, + "spec": { + "description": "Show the new alerting insights landing page", + "stage": "GA", + "codeowner": "@grafana/alerting-squad", + "frontend": true, + "hideFromAdminPage": true + } + }, + { + "metadata": { + "name": "externalCorePlugins", + "resourceVersion": "1695384000000", + "creationTimestamp": "2023-09-22T12:00:00Z" + }, + "spec": { + "description": "Allow core plugins to be loaded as external", + "stage": "experimental", + "codeowner": "@grafana/plugins-platform-backend" + } + }, + { + "metadata": { + "name": "pluginsAPIMetrics", + "resourceVersion": "1695297600000", + "creationTimestamp": "2023-09-21T12:00:00Z" + }, + "spec": { + "description": "Sends metrics of public grafana packages usage by plugins", + "stage": "experimental", + "codeowner": "@grafana/plugins-platform-backend", + "frontend": true + } + }, + { + "metadata": { + "name": "idForwarding", + "resourceVersion": "1695643200000", + "creationTimestamp": "2023-09-25T12:00:00Z" + }, + "spec": { + "description": "Generate signed id token for identity that can be forwarded to plugins and external services", + "stage": "experimental", + "codeowner": "@grafana/identity-access-team" + } + }, + { + "metadata": { + "name": "cloudWatchWildCardDimensionValues", + "resourceVersion": "1695816000000", + "creationTimestamp": "2023-09-27T12:00:00Z" + }, + "spec": { + "description": "Fetches dimension values from CloudWatch to correctly label wildcard dimensions", + "stage": "GA", + "codeowner": "@grafana/aws-datasources", + "allowSelfServe": true + } + }, + { + "metadata": { + "name": "externalServiceAccounts", + "resourceVersion": "1695902400000", + "creationTimestamp": "2023-09-28T12:00:00Z" + }, + "spec": { + "description": "Automatic service account and token setup for plugins", + "stage": "preview", + "codeowner": "@grafana/identity-access-team", + "hideFromAdminPage": true + } + }, + { + "metadata": { + "name": "panelMonitoring", + "resourceVersion": "1696766400000", + "creationTimestamp": "2023-10-08T12:00:00Z" + }, + "spec": { + "description": "Enables panel monitoring through logs and measurements", + "stage": "experimental", + "codeowner": "@grafana/dataviz-squad", + "frontend": true + } + }, + { + "metadata": { + "name": "enableNativeHTTPHistogram", + "resourceVersion": "1696334400000", + "creationTimestamp": "2023-10-03T12:00:00Z" + }, + "spec": { + "description": "Enables native HTTP Histograms", + "stage": "experimental", + "codeowner": "@grafana/hosted-grafana-team" + } + }, + { + "metadata": { + "name": "formatString", + "resourceVersion": "1697198400000", + "creationTimestamp": "2023-10-13T12:00:00Z" + }, + "spec": { + "description": "Enable format string transformer", + "stage": "preview", + "codeowner": "@grafana/grafana-bi-squad", + "frontend": true + } + }, + { + "metadata": { + "name": "transformationsVariableSupport", + "resourceVersion": "1696420800000", + "creationTimestamp": "2023-10-04T12:00:00Z" + }, + "spec": { + "description": "Allows using variables in transformations", + "stage": "preview", + "codeowner": "@grafana/grafana-bi-squad", + "frontend": true + } + }, + { + "metadata": { + "name": "kubernetesPlaylists", + "resourceVersion": "1699444800000", + "creationTimestamp": "2023-11-08T12:00:00Z" + }, + "spec": { + "description": "Use the kubernetes API in the frontend for playlists, and route /api/playlist requests to k8s", + "stage": "experimental", + "codeowner": "@grafana/grafana-app-platform-squad", + "requiresRestart": true + } + }, + { + "metadata": { + "name": "kubernetesSnapshots", + "resourceVersion": "1707374669879", + "creationTimestamp": "2023-12-04T12:00:00Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-02-08 06:44:29.879787 +0000 UTC" + } + }, + "spec": { + "description": "Routes snapshot requests from /api to the /apis endpoint", + "stage": "experimental", + "codeowner": "@grafana/grafana-app-platform-squad", + "requiresRestart": true + } + }, + { + "metadata": { + "name": "kubernetesQueryServiceRewrite", + "resourceVersion": "1706443200000", + "creationTimestamp": "2024-01-28T12:00:00Z" + }, + "spec": { + "description": "Rewrite requests targeting /ds/query to the query service", + "stage": "experimental", + "codeowner": "@grafana/grafana-app-platform-squad", + "requiresDevMode": true, + "requiresRestart": true + } + }, + { + "metadata": { + "name": "cloudWatchBatchQueries", + "resourceVersion": "1697803200000", + "creationTimestamp": "2023-10-20T12:00:00Z" + }, + "spec": { + "description": "Runs CloudWatch metrics queries as separate batches", + "stage": "preview", + "codeowner": "@grafana/aws-datasources" + } + }, + { + "metadata": { + "name": "recoveryThreshold", + "resourceVersion": "1696939200000", + "creationTimestamp": "2023-10-10T12:00:00Z" + }, + "spec": { + "description": "Enables feature recovery threshold (aka hysteresis) for threshold server-side expression", + "stage": "GA", + "codeowner": "@grafana/alerting-squad", + "requiresRestart": true + } + }, + { + "metadata": { + "name": "lokiStructuredMetadata", + "resourceVersion": "1700136000000", + "creationTimestamp": "2023-11-16T12:00:00Z" + }, + "spec": { + "description": "Enables the loki data source to request structured metadata from the Loki server", + "stage": "experimental", + "codeowner": "@grafana/observability-logs" + } + }, + { + "metadata": { + "name": "teamHttpHeaders", + "resourceVersion": "1697544000000", + "creationTimestamp": "2023-10-17T12:00:00Z" + }, + "spec": { + "description": "Enables datasources to apply team headers to the client requests", + "stage": "experimental", + "codeowner": "@grafana/identity-access-team" + } + }, + { + "metadata": { + "name": "awsDatasourcesNewFormStyling", + "resourceVersion": "1697112000000", + "creationTimestamp": "2023-10-12T12:00:00Z" + }, + "spec": { + "description": "Applies new form styling for configuration and query editors in AWS plugins", + "stage": "preview", + "codeowner": "@grafana/aws-datasources", + "frontend": true + } + }, + { + "metadata": { + "name": "cachingOptimizeSerializationMemoryUsage", + "resourceVersion": "1697112000000", + "creationTimestamp": "2023-10-12T12:00:00Z" + }, + "spec": { + "description": "If enabled, the caching backend gradually serializes query responses for the cache, comparing against the configured `[caching]max_value_mb` value as it goes. This can can help prevent Grafana from running out of memory while attempting to cache very large query responses.", + "stage": "experimental", + "codeowner": "@grafana/grafana-operator-experience-squad" + } + }, + { + "metadata": { + "name": "panelTitleSearchInV1", + "resourceVersion": "1697198400000", + "creationTimestamp": "2023-10-13T12:00:00Z" + }, + "spec": { + "description": "Enable searching for dashboards using panel title in search v1", + "stage": "experimental", + "codeowner": "@grafana/backend-platform", + "requiresDevMode": true + } + }, + { + "metadata": { + "name": "pluginsInstrumentationStatusSource", + "resourceVersion": "1697544000000", + "creationTimestamp": "2023-10-17T12:00:00Z" + }, + "spec": { + "description": "Include a status source label for plugin request metrics and logs", + "stage": "experimental", + "codeowner": "@grafana/plugins-platform-backend" + } + }, + { + "metadata": { + "name": "managedPluginsInstall", + "resourceVersion": "1697630400000", + "creationTimestamp": "2023-10-18T12:00:00Z" + }, + "spec": { + "description": "Install managed plugins directly from plugins catalog", + "stage": "preview", + "codeowner": "@grafana/plugins-platform-backend" + } + }, + { + "metadata": { + "name": "prometheusPromQAIL", + "resourceVersion": "1697716800000", + "creationTimestamp": "2023-10-19T12:00:00Z" + }, + "spec": { + "description": "Prometheus and AI/ML to assist users in creating a query", + "stage": "experimental", + "codeowner": "@grafana/observability-metrics", + "frontend": true + } + }, + { + "metadata": { + "name": "addFieldFromCalculationStatFunctions", + "resourceVersion": "1699012800000", + "creationTimestamp": "2023-11-03T12:00:00Z" + }, + "spec": { + "description": "Add cumulative and window functions to the add field from calculation transformation", + "stage": "preview", + "codeowner": "@grafana/grafana-bi-squad", + "frontend": true + } + }, + { + "metadata": { + "name": "alertmanagerRemoteSecondary", + "resourceVersion": "1698667200000", + "creationTimestamp": "2023-10-30T12:00:00Z" + }, + "spec": { + "description": "Enable Grafana to sync configuration and state with a remote Alertmanager.", + "stage": "experimental", + "codeowner": "@grafana/alerting-squad" + } + }, + { + "metadata": { + "name": "alertmanagerRemotePrimary", + "resourceVersion": "1698667200000", + "creationTimestamp": "2023-10-30T12:00:00Z" + }, + "spec": { + "description": "Enable Grafana to have a remote Alertmanager instance as the primary Alertmanager.", + "stage": "experimental", + "codeowner": "@grafana/alerting-squad" + } + }, + { + "metadata": { + "name": "alertmanagerRemoteOnly", + "resourceVersion": "1698667200000", + "creationTimestamp": "2023-10-30T12:00:00Z" + }, + "spec": { + "description": "Disable the internal Alertmanager and only use the external one defined.", + "stage": "experimental", + "codeowner": "@grafana/alerting-squad" + } + }, + { + "metadata": { + "name": "annotationPermissionUpdate", + "resourceVersion": "1698753600000", + "creationTimestamp": "2023-10-31T12:00:00Z" + }, + "spec": { + "description": "Separate annotation permissions from dashboard permissions to allow for more granular control.", + "stage": "experimental", + "codeowner": "@grafana/identity-access-team" + } + }, + { + "metadata": { + "name": "extractFieldsNameDeduplication", + "resourceVersion": "1698926400000", + "creationTimestamp": "2023-11-02T12:00:00Z" + }, + "spec": { + "description": "Make sure extracted field names are unique in the dataframe", + "stage": "experimental", + "codeowner": "@grafana/grafana-bi-squad", + "frontend": true + } + }, + { + "metadata": { + "name": "dashboardSceneForViewers", + "resourceVersion": "1698926400000", + "creationTimestamp": "2023-11-02T12:00:00Z" + }, + "spec": { + "description": "Enables dashboard rendering using Scenes for viewer roles", + "stage": "experimental", + "codeowner": "@grafana/dashboards-squad", + "frontend": true + } + }, + { + "metadata": { + "name": "dashboardScene", + "resourceVersion": "1699876800000", + "creationTimestamp": "2023-11-13T12:00:00Z" + }, + "spec": { + "description": "Enables dashboard rendering using scenes for all roles", + "stage": "experimental", + "codeowner": "@grafana/dashboards-squad", + "frontend": true + } + }, + { + "metadata": { + "name": "panelFilterVariable", + "resourceVersion": "1699012800000", + "creationTimestamp": "2023-11-03T12:00:00Z" + }, + "spec": { + "description": "Enables use of the `systemPanelFilterVar` variable to filter panels in a dashboard", + "stage": "experimental", + "codeowner": "@grafana/dashboards-squad", + "frontend": true, + "hideFromDocs": true + } + }, + { + "metadata": { + "name": "pdfTables", + "resourceVersion": "1699272000000", + "creationTimestamp": "2023-11-06T12:00:00Z" + }, + "spec": { + "description": "Enables generating table data as PDF in reporting", + "stage": "preview", + "codeowner": "@grafana/sharing-squad" + } + }, + { + "metadata": { + "name": "ssoSettingsApi", + "resourceVersion": "1699444800000", + "creationTimestamp": "2023-11-08T12:00:00Z" + }, + "spec": { + "description": "Enables the SSO settings API", + "stage": "experimental", + "codeowner": "@grafana/identity-access-team" + } + }, + { + "metadata": { + "name": "canvasPanelPanZoom", + "resourceVersion": "1703678400000", + "creationTimestamp": "2023-12-27T12:00:00Z" + }, + "spec": { + "description": "Allow pan and zoom in canvas panel", + "stage": "preview", + "codeowner": "@grafana/dataviz-squad", + "frontend": true + } + }, + { + "metadata": { + "name": "logsInfiniteScrolling", + "resourceVersion": "1699531200000", + "creationTimestamp": "2023-11-09T12:00:00Z" + }, + "spec": { + "description": "Enables infinite scrolling for the Logs panel in Explore and Dashboards", + "stage": "experimental", + "codeowner": "@grafana/observability-logs", + "frontend": true + } + }, + { + "metadata": { + "name": "flameGraphItemCollapsing", + "resourceVersion": "1699531200000", + "creationTimestamp": "2023-11-09T12:00:00Z" + }, + "spec": { + "description": "Allow collapsing of flame graph items", + "stage": "experimental", + "codeowner": "@grafana/observability-traces-and-profiling", + "frontend": true + } + }, + { + "metadata": { + "name": "alertingDetailsViewV2", + "resourceVersion": "1699531200000", + "creationTimestamp": "2023-11-09T12:00:00Z" + }, + "spec": { + "description": "Enables the preview of the new alert details view", + "stage": "experimental", + "codeowner": "@grafana/alerting-squad", + "frontend": true, + "hideFromDocs": true + } + }, + { + "metadata": { + "name": "datatrails", + "resourceVersion": "1700049600000", + "creationTimestamp": "2023-11-15T12:00:00Z" + }, + "spec": { + "description": "Enables the new core app datatrails", + "stage": "experimental", + "codeowner": "@grafana/dashboards-squad", + "frontend": true, + "hideFromDocs": true + } + }, + { + "metadata": { + "name": "alertingSimplifiedRouting", + "resourceVersion": "1699617600000", + "creationTimestamp": "2023-11-10T12:00:00Z" + }, + "spec": { + "description": "Enables the simplified routing for alerting", + "stage": "experimental", + "codeowner": "@grafana/alerting-squad", + "hideFromDocs": true + } + }, + { + "metadata": { + "name": "logRowsPopoverMenu", + "resourceVersion": "1700136000000", + "creationTimestamp": "2023-11-16T12:00:00Z" + }, + "spec": { + "description": "Enable filtering menu displayed when text of a log line is selected", + "stage": "GA", + "codeowner": "@grafana/observability-logs", + "frontend": true + } + }, + { + "metadata": { + "name": "pluginsSkipHostEnvVars", + "resourceVersion": "1700049600000", + "creationTimestamp": "2023-11-15T12:00:00Z" + }, + "spec": { + "description": "Disables passing host environment variable to plugin processes", + "stage": "experimental", + "codeowner": "@grafana/plugins-platform-backend" + } + }, + { + "metadata": { + "name": "tableSharedCrosshair", + "resourceVersion": "1702382400000", + "creationTimestamp": "2023-12-12T12:00:00Z" + }, + "spec": { + "description": "Enables shared crosshair in table panel", + "stage": "experimental", + "codeowner": "@grafana/grafana-bi-squad", + "frontend": true + } + }, + { + "metadata": { + "name": "regressionTransformation", + "resourceVersion": "1700827200000", + "creationTimestamp": "2023-11-24T12:00:00Z" + }, + "spec": { + "description": "Enables regression analysis transformation", + "stage": "preview", + "codeowner": "@grafana/grafana-bi-squad", + "frontend": true + } + }, + { + "metadata": { + "name": "displayAnonymousStats", + "resourceVersion": "1701259200000", + "creationTimestamp": "2023-11-29T12:00:00Z" + }, + "spec": { + "description": "Enables anonymous stats to be shown in the UI for Grafana", + "stage": "GA", + "codeowner": "@grafana/identity-access-team", + "frontend": true + } + }, + { + "metadata": { + "name": "lokiQueryHints", + "resourceVersion": "1702900800000", + "creationTimestamp": "2023-12-18T12:00:00Z" + }, + "spec": { + "description": "Enables query hints for Loki", + "stage": "GA", + "codeowner": "@grafana/observability-logs", + "frontend": true + } + }, + { + "metadata": { + "name": "kubernetesFeatureToggles", + "resourceVersion": "1703216580000", + "creationTimestamp": "2023-12-22T03:43:00Z" + }, + "spec": { + "description": "Use the kubernetes API for feature toggle management in the frontend", + "stage": "experimental", + "codeowner": "@grafana/grafana-operator-experience-squad", + "frontend": true, + "hideFromAdminPage": true + } + }, + { + "metadata": { + "name": "alertingPreviewUpgrade", + "resourceVersion": "1707425412785", + "creationTimestamp": "2024-01-03T12:00:00Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-02-08 20:50:12.785364 +0000 UTC" + } + }, + "spec": { + "description": "Show Unified Alerting preview and upgrade page in legacy alerting", + "stage": "GA", + "codeowner": "@grafana/alerting-squad", + "requiresRestart": true + } + }, + { + "metadata": { + "name": "enablePluginsTracingByDefault", + "resourceVersion": "1704801600000", + "creationTimestamp": "2024-01-09T12:00:00Z" + }, + "spec": { + "description": "Enable plugin tracing for all external plugins", + "stage": "experimental", + "codeowner": "@grafana/plugins-platform-backend", + "requiresRestart": true + } + }, + { + "metadata": { + "name": "cloudRBACRoles", + "resourceVersion": "1704888000000", + "creationTimestamp": "2024-01-10T12:00:00Z" + }, + "spec": { + "description": "Enabled grafana cloud specific RBAC roles", + "stage": "experimental", + "codeowner": "@grafana/identity-access-team", + "requiresRestart": true, + "hideFromDocs": true + } + }, + { + "metadata": { + "name": "alertingQueryOptimization", + "resourceVersion": "1704888000000", + "creationTimestamp": "2024-01-10T12:00:00Z" + }, + "spec": { + "description": "Optimizes eligible queries in order to reduce load on datasources", + "stage": "GA", + "codeowner": "@grafana/alerting-squad" + } + }, + { + "metadata": { + "name": "newFolderPicker", + "resourceVersion": "1705060800000", + "creationTimestamp": "2024-01-12T12:00:00Z" + }, + "spec": { + "description": "Enables the nested folder picker without having nested folders enabled", + "stage": "experimental", + "codeowner": "@grafana/grafana-frontend-platform", + "frontend": true + } + }, + { + "metadata": { + "name": "jitterAlertRulesWithinGroups", + "resourceVersion": "1705492800000", + "creationTimestamp": "2024-01-17T12:00:00Z" + }, + "spec": { + "description": "Distributes alert rule evaluations more evenly over time, including spreading out rules within the same group", + "stage": "preview", + "codeowner": "@grafana/alerting-squad", + "requiresRestart": true, + "hideFromDocs": true + } + }, + { + "metadata": { + "name": "onPremToCloudMigrations", + "resourceVersion": "1705894200000", + "creationTimestamp": "2024-01-22T03:30:00Z" + }, + "spec": { + "description": "In-development feature that will allow users to easily migrate their on-prem Grafana instances to Grafana Cloud.", + "stage": "experimental", + "codeowner": "@grafana/grafana-operator-experience-squad" + } + }, + { + "metadata": { + "name": "alertingSaveStatePeriodic", + "resourceVersion": "1705924800000", + "creationTimestamp": "2024-01-22T12:00:00Z" + }, + "spec": { + "description": "Writes the state periodically to the database, asynchronous to rule evaluation", + "stage": "privatePreview", + "codeowner": "@grafana/alerting-squad" + } + }, + { + "metadata": { + "name": "promQLScope", + "resourceVersion": "1706486400000", + "creationTimestamp": "2024-01-29T00:00:00Z" + }, + "spec": { + "description": "In-development feature that will allow injection of labels into prometheus queries.", + "stage": "experimental", + "codeowner": "@grafana/observability-metrics" + } + }, + { + "metadata": { + "name": "nodeGraphDotLayout", + "resourceVersion": "1704196800000", + "creationTimestamp": "2024-01-02T12:00:00Z" + }, + "spec": { + "description": "Changed the layout algorithm for the node graph", + "stage": "experimental", + "codeowner": "@grafana/observability-traces-and-profiling", + "frontend": true + } + }, + { + "metadata": { + "name": "groupToNestedTableTransformation", + "resourceVersion": "1707134400000", + "creationTimestamp": "2024-02-05T12:00:00Z" + }, + "spec": { + "description": "Enables the group to nested table transformation", + "stage": "preview", + "codeowner": "@grafana/dataviz-squad", + "frontend": true + } + }, + { + "metadata": { + "name": "newPDFRendering", + "resourceVersion": "1707425412785", + "creationTimestamp": "2024-02-08T20:50:12Z" + }, + "spec": { + "description": "New implementation for the dashboard to PDF rendering", + "stage": "experimental", + "codeowner": "@grafana/sharing-squad" + } + }, + { + "metadata": { + "name": "autoMigrateGraphPanel", + "resourceVersion": "1707433170195", + "creationTimestamp": "2024-02-08T22:59:30Z" + }, + "spec": { + "description": "Migrate old graph panel to supported time series panel - broken out from autoMigrateOldPanels to enable granular tracking", + "stage": "preview", + "codeowner": "@grafana/dataviz-squad", + "frontend": true + } + } + ] +} \ No newline at end of file diff --git a/pkg/services/featuremgmt/toggles_gen_test.go b/pkg/services/featuremgmt/toggles_gen_test.go index 9dd117f976f..946a52e4079 100644 --- a/pkg/services/featuremgmt/toggles_gen_test.go +++ b/pkg/services/featuremgmt/toggles_gen_test.go @@ -3,6 +3,7 @@ package featuremgmt import ( "bytes" "encoding/csv" + "encoding/json" "fmt" "html/template" "log" @@ -16,7 +17,10 @@ import ( "github.com/google/go-cmp/cmp" "github.com/olekukonko/tablewriter" "github.com/stretchr/testify/require" + v1 "k8s.io/apimachinery/pkg/apis/meta/v1" + featuretoggleapi "github.com/grafana/grafana/pkg/apis/featuretoggle/v0alpha1" + "github.com/grafana/grafana/pkg/services/apiserver/utils" "github.com/grafana/grafana/pkg/services/featuremgmt/strcase" ) @@ -26,6 +30,9 @@ func TestFeatureToggleFiles(t *testing.T) { } t.Run("check registry constraints", func(t *testing.T) { + invalidNames := make([]string, 0) + + // Check that all flags set in code are valid for _, flag := range standardFeatureFlags { if flag.Expression == "true" && !(flag.Stage == FeatureStageGeneralAvailability || flag.Stage == FeatureStageDeprecated) { t.Errorf("only FeatureStageGeneralAvailability or FeatureStageDeprecated features can be enabled by default. See: %s", flag.Name) @@ -45,19 +52,105 @@ func TestFeatureToggleFiles(t *testing.T) { if flag.AllowSelfServe && flag.Stage != FeatureStageGeneralAvailability { t.Errorf("only allow self-serving GA toggles") } - if flag.Created.Year() < 2021 { - t.Errorf("flag requires a reasonable created date. See: %s (%s)", - flag.Name, flag.Created.Format(time.DateOnly)) - } - } - }) - - t.Run("all new features should have an owner", func(t *testing.T) { - for _, flag := range standardFeatureFlags { if flag.Owner == "" { t.Errorf("feature %s does not have an owner. please fill the FeatureFlag.Owner property", flag.Name) } + // Check camel case names + if flag.Name != strcase.ToLowerCamel(flag.Name) && !legacyNames[flag.Name] { + invalidNames = append(invalidNames, flag.Name) + } } + + // Make sure the names are valid + require.Empty(t, invalidNames, "%s feature names should be camel cased", invalidNames) + // acronyms can be configured as needed via `ConfigureAcronym` function from `./strcase/camel.go` + + // Now that we know they are valid, update the json database + t.Run("update k8s resource list", func(t *testing.T) { + created := v1.NewTime(time.Now().UTC()) + resourceVersion := fmt.Sprintf("%d", created.UnixMilli()) + + featuresFile := "toggles_gen.json" + current := featuretoggleapi.FeatureList{ + TypeMeta: v1.TypeMeta{ + Kind: "FeatureList", + APIVersion: featuretoggleapi.APIVERSION, + }, + } + existing := featuretoggleapi.FeatureList{} + body, err := os.ReadFile(featuresFile) + if err == nil { + _ = json.Unmarshal(body, &existing) + current.ListMeta = existing.ListMeta + } + + lookup := map[string]featuretoggleapi.FeatureSpec{} + for _, flag := range standardFeatureFlags { + lookup[flag.Name] = featuretoggleapi.FeatureSpec{ + Description: flag.Description, + Stage: flag.Stage.String(), + Owner: string(flag.Owner), + RequiresDevMode: flag.RequiresDevMode, + FrontendOnly: flag.FrontendOnly, + RequiresRestart: flag.RequiresRestart, + AllowSelfServe: flag.AllowSelfServe, + HideFromAdminPage: flag.HideFromAdminPage, + HideFromDocs: flag.HideFromDocs, + // EnabledVersion: ???, + } + + // Replace them all + // current.Items = append(current.Items, featuretoggleapi.Feature{ + // ObjectMeta: v1.ObjectMeta{ + // Name: flag.Name, + // CreationTimestamp: v1.NewTime(flag.Created), + // ResourceVersion: fmt.Sprintf("%d", flag.Created.UnixMilli()), + // }, + // Spec: lookup[flag.Name], + // }) + // current.ListMeta.ResourceVersion = resourceVersion + } + + // Check for changes in any existing values + for _, item := range existing.Items { + v, ok := lookup[item.Name] + if ok { + delete(lookup, item.Name) + a, e1 := json.Marshal(v) + b, e2 := json.Marshal(item.Spec) + if e1 != nil || e2 != nil || !bytes.Equal(a, b) { + item.ResourceVersion = resourceVersion + if item.Annotations == nil { + item.Annotations = make(map[string]string) + } + item.Annotations[utils.AnnoKeyUpdatedTimestamp] = created.String() + item.Spec = v // the current value + } + } else { + item.DeletionTimestamp = &created + fmt.Printf("mark feature as deleted") + } + current.Items = append(current.Items, item) + } + + // New flags not in the existing list + for k, v := range lookup { + current.Items = append(current.Items, featuretoggleapi.Feature{ + ObjectMeta: v1.ObjectMeta{ + Name: k, + CreationTimestamp: created, + ResourceVersion: fmt.Sprintf("%d", created.UnixMilli()), + }, + Spec: v, + }) + } + + out, err := json.MarshalIndent(current, "", " ") + require.NoError(t, err) + + err = os.WriteFile(featuresFile, out, 0644) + require.NoError(t, err, "error writing file") + }) }) t.Run("verify files", func(t *testing.T) { @@ -85,22 +178,6 @@ func TestFeatureToggleFiles(t *testing.T) { generateCSV(), ) }) - - t.Run("check feature naming convention", func(t *testing.T) { - invalidNames := make([]string, 0) - for _, f := range standardFeatureFlags { - if legacyNames[f.Name] { - continue - } - - if f.Name != strcase.ToLowerCamel(f.Name) { - invalidNames = append(invalidNames, f.Name) - } - } - - require.Empty(t, invalidNames, "%s feature names should be camel cased", invalidNames) - // acronyms can be configured as needed via `ConfigureAcronym` function from `./strcase/camel.go` - }) } func verifyAndGenerateFile(t *testing.T, fpath string, gen string) { @@ -214,9 +291,8 @@ func generateCSV() string { w := csv.NewWriter(&buf) if err := w.Write([]string{ "Name", - "Stage", //flag.Stage.String(), - "Owner", //string(flag.Owner), - "Created", + "Stage", //flag.Stage.String(), + "Owner", //string(flag.Owner), "requiresDevMode", //strconv.FormatBool(flag.RequiresDevMode), "RequiresRestart", //strconv.FormatBool(flag.RequiresRestart), "FrontendOnly", //strconv.FormatBool(flag.FrontendOnly), @@ -224,19 +300,11 @@ func generateCSV() string { log.Fatalln("error writing record to csv:", err) } - dateFormatter := func(t time.Time) string { - if t.Year() < 2020 { // fake year - return "" - } - return t.Format(time.DateOnly) - } - for _, flag := range standardFeatureFlags { if err := w.Write([]string{ flag.Name, flag.Stage.String(), string(flag.Owner), - dateFormatter(flag.Created), strconv.FormatBool(flag.RequiresDevMode), strconv.FormatBool(flag.RequiresRestart), strconv.FormatBool(flag.FrontendOnly),